调了半天,只过了样例、
#include <bits/stdc++.h>
using namespace std;
struct dian
{
int x, y;
}d[1000005];
struct edge
{
int u, v;
double w;
}e[1000005];
int n, m, cnt, parent[1000005], ei;
double ans;
double juli(int x, int y)
{
return (double)(sqrt((double)(d[x].x - d[y].x) * (d[x].x - d[y].x) + (double)(d[x].y - d[y].y) * (d[x].y - d[y].y)));
}
int find(int v1)
{
while (v1 != parent[v1])
{
v1 = parent[v1];
}
return v1;
}
void _union(int v1, int v2)
{
int p1 = find(v1);
int p2 = find(v2);
if (p1 != p2)
{
parent[p1] = p2;
}
}
bool isSame(int v1, int v2)
{
if (find(v1) == find(v2))
{
return true;
}
return false;
}
int cmp(edge a, edge b)
{
return a.w < b.w;
}
void Kruskal()
{
for (int i = 1 ; i <= ei ; i ++)
{
if (isSame(e[i].u, e[i].v))
{
continue;
}
ans += e[i].w;
cout << e[i].w;
_union(e[i].u, e[i].v);
cnt ++;
if (cnt == n)
{
break;
}
}
}
int main()
{
cin >> n >> m;
for (int i = 1 ; i <= n ; i ++)
{
parent[i] = i;
cin >> d[i].x >> d[i].y;
}
for (int i = 1 ; i <= n ; i ++)
{
for (int j = i + 1 ; j <= n ; j ++)
{
e[++ ei].u = i;
e[ei].v = j;
e[ei].w = juli(i, j);
}
}
for (int i = 1 ; i <= m ; i ++)
{
int x, y;
cin >> x >> y;
e[++ ei].u = x;
e[ei].v = y;
e[ei].w = 0.0;
}
sort(e + 1, e + 1 + ei, cmp);
Kruskal();
cout << fixed << setprecision(2) << ans;
return 0;
}