依然是 Kruskal
#include <cstdio>
#include <algorithm>
#include <cmath>
#define N 750
#define inf 1e200
using namespace std;
double w[N * N];
double x[N + 2], y[N +2];
int u[N * N], v[N * N];
int p[N + 2];
int r[N * N];
double dis(double x1, double y1, double x2, double y2)
{
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
bool cmp(int i, int j)
{
return w[i] < w[j];
}
int find(int x){return p[x] == x? x: (p[x] = find(p[x])); }
int main()
{
int n, m, M;
// FILE* fp = fopen("in.txt", "r");
while (scanf("%d", &n) != EOF)
{
for (int i = 0; i <n; i++)
scanf("%lf %lf", x+i, y+i);
int m = (n - 1) * (n) / 2;
int cnt = 0;
for (int i = 0;i < n; i++)
for (int j = i + 1; j < n; j++)
{
w[cnt] = dis(x[i], y[i], x[j], y[j]);
u[cnt] = i, v[cnt] = j;
cnt++;
}
// if (cnt == m)puts("OK!!");
for (int i = 0; i < m; i++)r[i] = i;
for (int i = 0; i < n; i++)p[i] = i;
scanf("%d", &M);
int xx, yy;
while (M--)
{
scanf("%d %d", &xx, &yy);
if (xx > yy)xx^=yy, yy ^= xx, xx^=yy;
xx--, yy--;
int t = xx * n + yy - (xx + 2)*(xx + 1)/ 2;
w[t] = 0.0;
}
sort(r, r+m, cmp);
double ans = 0;
for (int i = 0; i < m; i++)
{
int e = r[i];
int x = find(u[e]);
int y = find(v[e]);
if (x != y){ p[x] = y,ans += (w[e]);}
}
printf("%.2f\n", ans);
// getchar();
}
return 0;
}