HDU 1301 Jungle Roads(裸最小生成树)
今天做了好几个模版最小生成树。。。贴一个kurskral.
1 /* 2 HDU 1301 Jungle Roads 3 最小生成树Kurskal模版 4 */ 5 #include <stdio.h> 6 #include <string.h> 7 #include <stdlib.h> 8 int num,sum; 9 int o[101]; 10 struct edge 11 { 12 int sv; 13 int ev; 14 int w; 15 } p[5000]; 16 int cmp(const void *a,const void *b) 17 { 18 return (*(struct edge *)a).w > (*(struct edge *)b).w ? 1:-1; 19 } 20 int find(int x) 21 { 22 int r = x,t; 23 while(x != o[x]) 24 x = o[x]; 25 while(r != x) 26 { 27 t = o[r]; 28 o[r] = x; 29 r = t; 30 } 31 return x; 32 } 33 void merge(int x,int y,int w) 34 { 35 x = find(x); 36 y = find(y); 37 if(x != y) 38 { 39 o[x] = y; 40 sum += w; 41 num ++; 42 } 43 } 44 int main() 45 { 46 int i,j,n,m,ss,vv,ww,k; 47 char str[3]; 48 while(scanf("%d%*c",&n)!=EOF) 49 { 50 if(!n) break; 51 k = 0; 52 for(i = 1;i <= n;i ++) 53 o[i] = i; 54 for(i = 1; i <= n-1; i ++) 55 { 56 scanf("%s",str); 57 ss = str[0] - 'A' + 1; 58 scanf("%d%*c",&m); 59 for(j = 1; j <= m; j ++) 60 { 61 scanf("%s%d%*c",str,&ww); 62 vv = str[0] - 'A' + 1; 63 p[k].sv = ss; 64 p[k].ev = vv; 65 p[k].w = ww; 66 k ++; 67 } 68 } 69 qsort(p,k,sizeof(p[0]),cmp); 70 sum = 0; 71 num = 1; 72 for(i = 0; i <= k-1; i ++) 73 { 74 merge(p[i].sv,p[i].ev,p[i].w); 75 if(num == n) 76 break; 77 } 78 printf("%d\n",sum); 79 } 80 return 0; 81 }