ZOJ1542 POJ1861

题意:给你N个点M条边,求最小生成树,并且输出最小生成树里最大的那条边,并且输出路径 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 #define N 1005
 9 #define M 15005
10 int father[N],rank[N],n,m,sum,MAX,num;
11 int NUM[N];
12 struct Edge
13 {
14     int u;
15     int v;
16     int w;
17 }edge[M];
18 
19 bool cmp(Edge a,Edge b)
20 {
21     return a.w < b.w ;
22 }
23 
24 void Init()
25 {
26     for(int i=0; i<=n; i++)
27     {
28         father[i] = i;
29         rank[i] = 1;
30     }
31 }
32 
33 int find(int x)
34 {
35     if(father[x] != x)
36     {
37         father[x] = find(father[x]);
38     }
39     return father[x] ;
40 }
41 
42 void merge(int x,int y)
43 {
44     int xf = find(x);
45     int yf = find(y);
46     if(rank[xf] > rank[yf])
47     {
48         rank[xf] += rank[yf];
49         father[yf] = xf;
50     }
51     else
52     {
53         rank[yf] += rank[xf];
54         father[xf] = yf;
55     }
56 }
57 
58 void Kruskal()
59 {
60     num = 0; 
61     MAX=0;
62     for(int i=0; i<m; i++)
63     {
64         int u = edge[i].u;
65         int v = edge[i].v;
66         if(find(u) != find(v))
67         {
68             NUM[num] = i;
69             num++ ;
70             sum += edge[i].w;
71             MAX = max(MAX,edge[i].w);
72             merge(u,v);
73         }
74         if(num == n-1) break;
75     }
76 }
77 
78 int main()
79 {
80     while(scanf("%d%d",&n,&m)!=EOF)
81     {
82         Init();
83         for(int i=0; i<m; i++)
84         {
85             scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
86         }
87         sort(edge,edge+m,cmp);
88         sum = 0;
89         Kruskal();
90         printf("%d\n",MAX);
91         printf("%d\n",num);
92         for(int i=0; i<num; i++)
93         {
94             printf("%d %d\n",edge[NUM[i]].u,edge[NUM[i]].v);
95         }
96     }
97     return 0;
98 } 
View Code

 

posted on 2013-07-29 15:13  爱∪  阅读(180)  评论(0编辑  收藏  举报

导航