HDU 1233 还是畅通工程(模板——克鲁斯卡尔算法)
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1233
题意描述:
输入n个城镇以及n*(n-1)/2条道路信息
计算并输出将所有城镇连通或者间接连通需要修建的最短道路的总长度
解题思路:
最小生成树问题模板题,使用克鲁斯卡尔算法即可。
AC代码:
1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 5 struct edge 6 { 7 int u,v,w; 8 }; 9 struct edge e[100010]; 10 int cmp(struct edge x,struct edge y) 11 { 12 return x.w < y.w; 13 } 14 int f[1000]; 15 int merge(int u,int v); 16 int getf(int u); 17 int main() 18 { 19 int i,n,m,sum,count; 20 while(scanf("%d",&n),n != 0) 21 { 22 m=n*(n-1)/2; 23 for(i=1;i<=m;i++) 24 scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); 25 sort(e+1,e+m+1,cmp); 26 for(i=1;i<=n;i++) 27 f[i]=i; 28 count=0; 29 sum=0; 30 for(i=1;i<=m;i++) 31 { 32 if( merge(e[i].u,e[i].v) ) 33 { 34 count++; 35 sum += e[i].w; 36 } 37 if(count==n-1) 38 break; 39 } 40 printf("%d\n",sum); 41 } 42 return 0; 43 } 44 int merge(int u,int v) 45 { 46 int t1,t2; 47 t1=getf(u); 48 t2=getf(v); 49 if(t1 != t2) 50 { 51 f[t2]=t1; 52 return 1; 53 } 54 return 0; 55 } 56 int getf(int u) 57 { 58 if(f[u]==u) 59 return u; 60 else 61 { 62 f[u]=getf(f[u]); 63 return f[u]; 64 } 65 }
欢迎交流,共同进步——