UVa 10034 - Freckles

传送门

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;
}

Powered by Jekyll and Theme by solid