您的位置:首页 > 其它

HDU3405-World Islands

2015-08-20 10:46 477 查看
经过遍历生成树水过去了,还是不太理解为什么不能一次性kruskal然后少连接一条边来判断。数据略水。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<math.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
using namespace std;
int pre[60];
int find(int x)
{
    while(x!=pre[x])
        x=pre[x];
    return x;
}
double x[60],y[60];
struct e
{
    int x,y;
    double z;
}a[2600];

int cmp(e a,e b)
{
    return a.z<b.z;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%lf%lf",&x[i],&y[i]);
        }
        double res=999999;
        for(int num=1;num<=n;num++)
        {
            for(int i=1;i<=n;i++) pre[i]=i;

            int edg=0;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
            {
                if(i==num||j==num) continue;
                a[edg].x=i;
                a[edg].y=j;
                a[edg++].z=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
            }
           // printf("edg %d\n",edg);

            sort(a,a+edg,cmp);
            double ans=0;
            for(int i=0;i<edg;i++){
                int dx=find(a[i].x);
                int dy=find(a[i].y);
                if(dx!=dy){
                    pre[dx]=dy;
                    ans+=a[i].z;
                }
            }
            res=min(res,ans);
        }
        printf("%.2f\n",res);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: