UVa 10034 - Freckles
传送门
思路
最小生成树模板题
代码
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#pragma comment(linker, "/STACK:102400000,102400000")
const int MAXN = 5700;
struct POINT
{
double x, y;
}point[MAXN];
int u[MAXN], v[MAXN], p[MAXN], r[MAXN], n, k;
double dis[MAXN], ans;
int cmp(const int i, const int j)
{
return dis[i] < dis[j];
}
int Find(int x)
{
return p[x] == x ? x : p[x] = Find(p[x]);
}
void Kruskal()
{
for (int i = 0; i < k; i++)
p[i] = i;
for (int i = 0; i < k; i++)
r[i] = i;
sort(r, r + k, cmp);
for (int i = 0; i < k; i++)
{
int e = r[i];
int x = Find(u[e]), y = Find(v[e]);
if (x != y)
{
ans += dis[e];
p[x] = y;
}
}
}
int main()
{
//freopen("input.txt", "r", stdin);
int T, i, j;
scanf("%d", &T);
while (T--)
{
k = ans = 0;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%lf%lf", &point[i].x, &point[i].y);
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
{
u[k] = i, v[k] = j;
dis[k++] = hypot(point[i].x - point[j].x, point[i].y - point[j].y);
}
Kruskal();
printf("%.2f\n", ans);
if (T)
printf("\n");
}
return 0;
}
- 上一篇图论部分备忘
- 下一篇UVa 567 - Risk