修建道路


Submit solution

Points: 100
Time limit: 1.0s
Memory limit: 80M

Author:
Problem type
Allowed languages
C, C++

Building Roads

题目描述

给定 \(n\) 个点的坐标,第 \(i\) 个点位于 \((x_i, y_i)\),点编号为 \(1 \dots n\)。又给定 \(m\) 条已存在的无向边,第 \(i\) 条边连接点 \(u_i\) 与 \(v_i\)。 现在允许你再新建若干条边,使得图变为连通图(任意两点可达)。请计算:为达成连通所需新建边的总长度最小值。

边长(边权)定义: 任意两点 \(a=(x_a,y_a)\), \(b=(x_b,y_b)\) 之间的新建边的长度为它们的欧几里得距离: \( \mathrm{dist}(a,b)=\sqrt{(x_a-x_b)^2+(y_a-y_b)^2}. \) 已给定的 \(m\) 条边视为"已建成且免费",不计入新建成本(等价于这些点对已连通,费用为 0)。

输入格式

  • 第一行:两个整数 \(n, m\) —— 点数与已存在边数。
  • 接下来 \(n\) 行:第 \(i\) 行给出两个整数 \(x_i, y_i\),表示点的坐标。
  • 接下来 \(m\) 行:每行两个整数 \(u_i, v_i\),表示一条已存在的无向边。

输出格式

输出一个实数,表示为使整张图连通所需新建边的最小总长度;保留两位小数输出。为避免精度误差,请使用 64 位浮点类型进行计算。

样例

输入

4 1
1 1
3 1
2 3
4 3
1 4

输出

4.00

说明/提示

  • 数据范围:\(1 \le n,m \le 1000\), \(1 \le x_i,y_i \le 10^6\), \(1 \le u_i,v_i \le n\)。

Comments

There are no comments at the moment.