POJ2485 Highways 最小生成树 C语言

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

题目大意:输入各城镇之间的距离,求最小生成树中最长的边。

算法:最小生成树。

提交情况:3次RE,1次AC

总结:边集一定要开大。

思路:建立无向图,用上三角矩阵表示,并查集 + 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 (1000 + 10)
14
15
16
17 #define I64 __int64
18
19
20
21 typedef struct Graph {
22
23 I64 u, v, len;
24
25 } graph;
26
27 graph edge[MAXN * 1000]; //边集一定要开够
28
29 I64 cnt;
30
31 I64 father[MAXN];
32
33
34
35 void Clear() {
36
37 memset(edge, 0, sizeof(edge));
38
39 memset(father, 0, sizeof(father));
40
41 }
42
43
44
45 void Build_Map(int n) {
46
47 I64 i, j, k = 1;
48
49 I64 len;
50
51 for(i = 1; i <= n; i++) {
52
53 for(j = 1; j <= n; j++) {
54
55 scanf("%I64d", &len);
56
57 if(len && (j > i)) { //无向图,存上三角矩阵
58
59 edge[k].u = i;
60
61 edge[k].v = j;
62
63 edge[k++].len = len;
64
65 cnt++;
66
67 }
68
69 }
70
71 father[i] = i; //每个顶点建立单元素集
72
73 }
74
75 }
76
77
78
79 int cmp(graph &a, graph &b) { //按len非降序排列
80
81 return a.len < b.len;
82
83 }
84
85
86
87 I64 Find(I64 u) {
88
89 if(u != father[u])
90
91 father[u] = Find(father[u]); //路径压缩,找到根节点
92
93 return father[u];
94
95 }
96
97
98
99 void Union(I64 u, I64 v) {
100
101 father[u] = v; //合并连通分支
102
103 }
104
105
106
107 I64 MLT() {
108
109 I64 i, j;
110
111 I64 fu, fv;
112
113 I64 longest = 0;
114
115 for(i = 1; i <= cnt; i++) { //遍历边集
116
117 fu = Find(edge[i].u);
118
119 fv = Find(edge[i].v);
120
121 if(fu != fv) { //安全边
122
123 longest = longest > edge[i].len ? longest : edge[i].len; //最小生成树中最长边
124
125 Union(fu, fv); //合并
126
127 }
128
129 }
130
131 return longest;
132
133 }
134
135
136
137 int main() {
138
139 int t;
140
141 int n;
142
143 scanf("%d", &t);
144
145 while(t--) {
146
147 Clear();
148
149 scanf("%d", &n);
150
151 Build_Map(n);
152
153 sort(edge + 1, edge + cnt + 1, cmp);
154
155 printf("%I64d\n", MLT());
156
157 }
158
159 return 0;
160
161 }
162
163
164
posted @ 2011-07-20 16:23  cloehui  阅读(216)  评论(0编辑  收藏  举报