POJ2395 Out of Hay Kruskal+并查集 C语言

题目:http://poj.org/problem?id=2395

题目大意:找到连接所有农场的最小生成树,并找到其中最长的一条路。

算法:Kruskal+并查集

提交情况:1次AC

思路:很裸的Kruskal+并查集,连边数都给出来了。建立边集,常规Kruskal+并查集,记录当前最小生成树中最大边。

 

AC code

 

View Code
  1 #include<stdio.h>
2
3 #include<stdlib.h>
4
5 #include<string.h>
6
7 #include<algorithm>
8
9 using namespace std;
10
11
12
13 #define MAXN (2000+100)
14
15 #define MAX (10000 + 100)
16
17
18
19 typedef struct Graph{
20
21 int u, v, len;
22
23 }graph;
24
25
26
27 graph edge[MAX];
28
29 int father[MAXN];
30
31
32
33 void Build_Map(int n, int m) {
34
35 int i;
36
37 for(i = 1; i <= m; i++) {
38
39 scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].len);
40
41 }
42
43 for(i = 1; i <= n; i++)
44
45 father[i] = i;
46
47 }
48
49
50
51 int cmp(graph &a, graph &b){
52
53 return a.len < b.len;
54
55
56
57 }
58
59
60
61 int Find(int u) {
62
63 return u != father[u] ? Find(father[u]) : father[u];
64
65 }
66
67
68
69 void Union(int u, int v) {
70
71 father[u] = v;
72
73 }
74
75
76
77 int MLT(int m) {
78
79 int i, j;
80
81 int max = 0;
82
83 int fu, fv;
84
85 for(i = 1; i <= m; i++) {
86
87 fu = Find(edge[i].u);
88
89 fv = Find(edge[i].v);
90
91 if(fu != fv) {
92
93 max = max > edge[i].len ? max : edge[i].len;
94
95 Union(fu, fv);
96
97 }
98
99 }
100
101 return max;
102
103 }
104
105
106
107 int main() {
108
109 int n, m;
110
111 scanf("%d%d", &n, &m);
112
113 Build_Map(n, m);
114
115 sort(edge + 1, edge + m + 1, cmp);
116
117 printf("%d\n", MLT(m));
118
119 //system("pause");
120
121 return 0;
122
123 }
posted @ 2011-07-20 16:27  cloehui  阅读(261)  评论(0编辑  收藏  举报