SDUT 2144 图结构练习——最小生成树(kruskal模版)
真郁闷。。。模版题,由于自己SB错误,错了5 6 次。。。不过也有好处,加深对模版的理解了。。 kruskal 模版
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 int o[101],sum,num; 5 struct edge//图的结构体 6 { 7 int sv,ev,w;//起始边,终边,权值。 8 }; 9 struct edge p[10000];//必须开到大于(n*n-1)/2,否则必然RE。。。 10 int comp(const void *a,const void *b) 11 { 12 return (*(struct edge*)a).w > (*(struct edge*)b).w ?1:-1; 13 } 14 int find(int x)//并查集find函数 15 { 16 int a = x; 17 while(a != o[a]) 18 { 19 a = o[a]; 20 } 21 return a; 22 } 23 void merge(int x,int y,int w)//并查集merge函数 24 { 25 int x1,y1; 26 x1 = find(x); 27 y1 = find(y); 28 if(x1 != y1) 29 { 30 o[x1] = y1; 31 sum += w; 32 num ++; 33 } 34 } 35 int main() 36 { 37 int n,m,i; 38 while(scanf("%d%d",&n,&m)!=EOF) 39 { 40 sum = 0; 41 num = 1; 42 for(i = 1;i <= n;i ++)//初始化并查集。。(擦,这里都出错了) 43 o[i] = i; 44 for(i = 0;i <= m-1;i ++) 45 { 46 scanf("%d %d %d",&p[i].sv,&p[i].ev,&p[i].w); 47 } 48 qsort(p,m,sizeof(p[0]),comp);//调用结构体快排 49 for(i = 0;i <= m-1;i ++) 50 { 51 merge(p[i].sv,p[i].ev,p[i].w); 52 if(num == n) break;//终止条件,合并n-1次。 53 } 54 printf("%d\n",sum); 55 } 56 return 0; 57 }