UVA 10034 Freckles 【最小生成树】

题目链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=975

题意:裸的最小生成树

代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <stack>
#include <queue>

using namespace std;
using namespace std;

#define INF 999999

double map[130][130],dis[130];
int v[130];

double prim(int n)
{
    int i,j,k;
    double min,sum=0;
    for(i=1;i<=n;i++)
        dis[i]=map[1][i];
    memset(v,0,sizeof(v));
    v[1]=1;
    dis[1]=0;
    for(i=2;i<=n;i++)
    {
        k=1;
        min=INF;
        for(j=1;j<=n;j++)
            if(!v[j]&&min>dis[j])
            {
                k=j;
                min=dis[j];
            }
        sum+=min;
        v[k]=1;
        for(j=1;j<=n;j++)
            if(!v[j]&&dis[j]>map[k][j])
                dis[j]=map[k][j];
    }
    return sum;
}

struct node
{
    double x,y;
}p[110];

double get_dis(node a,node b)
{
    return sqrt((a.x - b.x) *(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
}

int main()
{
    int n;
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
               {
                   if (i!=j) map[i][j]=INF;
                   else map[i][j] = 0;
               }
        for(int i=1;i<=n;i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        for(int i=1;i<=n;i++)
            for(int j = 1;j<=n;j++)
            map[i][j] = get_dis(p[i],p[j]);

        printf("%.2lf\n",prim(n));
        if (t) printf("\n");
    }
    return 0;
}

你可能感兴趣的:(uva)