POJ1861 Network Kruscal+并查集 C语言

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

题目大意:要用最短的电缆把所有的电脑都连接起来。

算法:Kruscal+并查集

思路:常规Kruscal+并查集。先开始没注意到是SPJ,看样例输出一个环很是疑惑,纠结了半天,看了discuss,才知道是样例的问题……不用管样例,常规做就好

提交情况:1次AC

 

 AC code:

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