UVA 10034 Freckles
最小生成树的水题。。。居然因为输出格式wa了好多次。。太坑了- -
输入两个数代表每个城市的坐标。。然后每两个城市的道路就可以确定了。。
然后就是最小生成树了。。我是用Kruskal算法写的。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
int t;
int n;
double x[205], y[205];
int parent[205];
struct Q
{
int a;
int b;
double value;
} q[55555];
bool cmp(Q a, Q b)
{
return a.value < b.value;
}
int find(int x)
{
if (parent[x] == x)
return x;
else
return find(parent[x]);
}
int main()
{
scanf("%d", &t);
while (t --)
{
memset(q, 0, sizeof(q));
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
memset(parent, 0, sizeof(parent));
scanf("%d", &n);
for (int i = 1; i <= n; i ++)
parent[i] = i;
for (int i = 1; i <= n; i ++)
scanf("%lf%lf", &x[i], &y[i]);
int sbb = 0;
for (int i = 1; i <= n; i ++)
for (int j = i + 1; j <= n; j++)
{
q[sbb].a = i;
q[sbb].b = j;
q[sbb].value = (x[i] - x[j]) * (x[i] - x[j]) +(y[i] - y[j]) * (y[i] - y[j]);
sbb ++;
}
sort(q, q + sbb, cmp);
double sbbb = 0;
for (int i = 0; i < sbb; i ++)
{
int pa = find(q[i].a);
int pb = find(q[i].b);
if (pa != pb)
{
parent[pb] = pa;
sbbb += sqrt(q[i].value);
}
}
printf("%.2lf\n", sbbb);
if (t)
printf("\n");
}
return 0;
}