HDU-4463-Outlets

来源:互联网 发布:单片机编程器的作用 编辑:程序博客网 时间:2024/05/17 23:21

HDU-4463-Outlets

http://acm.hdu.edu.cn/showproblem.php?pid=4463

已知两点相连,求最小生成树,第一次参加现场赛,各种悲剧。。。这题是我敲的,调试了半天才过。。。菜鸟伤不起哇。。。

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define N 100struct node{int x;int y;double len;}bian[N*N];double dian[N][2];double map[N][N];int f[N];int n;int cmp(const void *a,const void *b){return (*(struct node *)a).len<(*(struct node *)b).len?-1:1;}void init(){int i;for(i=1;i<=n;i++)f[i]=i;}int find(int x){int r=x;while(f[r]!=r)r=f[r];f[x]=r;return r;}int merge(int x,int y){int fx,fy;fx=find(x);fy=find(y);if(fx!=fy){f[fx]=fy;return 1;}return 0;}int main(){int i,j,a,b,t,num;double ans;while(scanf("%d",&n),n){scanf("%d%d",&a,&b);for(i=1;i<=n;i++)scanf("%lf%lf",&dian[i][0],&dian[i][1]);t=0;ans=0;for(i=1;i<=n;i++)for(j=i+1;j<=n;j++){bian[t].x=i;bian[t].y=j;bian[t].len=sqrt((dian[i][0]-dian[j][0])*(dian[i][0]-dian[j][0])+(dian[i][1]-dian[j][1])*(dian[i][1]-dian[j][1]));map[i][j]=map[j][i]=bian[t++].len;}qsort(bian,t,sizeof(struct node),cmp);init();f[find(a)]=find(b);ans+=map[a][b];num=1;//已经有一条边了        for(i=0;i<t;i++){if((bian[i].x==a&&bian[i].y==b)||(bian[i].x==b&&bian[i].y==a))continue;if(merge(bian[i].x,bian[i].y)){num++;ans+=bian[i].len;}if(num==n-1)  //如果加入了n-1条边,则构成最小生成树,结束循环break;}printf("%.2lf\n",ans);}return 0;}


原创粉丝点击