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 }
posted @ 2012-06-13 15:05  Naix_x  阅读(216)  评论(0编辑  收藏  举报