HDU3405-World Islands

来源:互联网 发布:土方平衡计算软件 编辑:程序博客网 时间:2024/06/15 05:05

经过遍历生成树水过去了,还是不太理解为什么不能一次性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;}


0 0
原创粉丝点击