POJ1258 Agri-Net 最小生成树 C语言

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

题目大意:多组测试用例,找出连接所有农场的最短路径。

算法:最小生成树 + 并查集。

提交情况:1次WA,1次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 MAX (100 + 10)
14
15 #define MAXN (100000 + 100)
16
17
18
19 typedef struct Graph {
20
21 int u, v, len;
22
23 } graph;
24
25 graph edge[MAXN];
26
27 int father[MAX];
28
29 int cnt = 0;
30
31
32
33 void Clear() {
34
35 memset(edge, 0, sizeof(edge));
36
37 memset(father, 0, sizeof(father));
38
39 }
40
41 int cmp(graph &a, graph &b) {
42
43 return a.len < b.len;
44
45 }
46
47
48
49 void Build_Map(int n) {
50
51 int i, j, k = 1;
52
53 int len;
54
55 for(i = 1; i <= n; i++) {
56
57 for(j = 1; j <= n; j++) {
58
59 scanf("%d", &len);
60
61 if (len && j > i) {
62
63 edge[k].u = i;
64
65 edge[k].v = j;
66
67 edge[k++].len = len;
68
69 cnt++;
70
71 }
72
73 }
74
75 father[i] = i;
76
77 }
78
79 }
80
81
82
83 int Find(int u) {
84
85 if(u != father[u])
86
87 father[u] = Find(father[u]);
88
89 return father[u];
90
91 }
92
93
94
95 void Union(int u, int v) {
96
97 father[u] = v;
98
99 }
100
101
102
103 int MLT() {
104
105 int road = 0;
106
107 int fu, fv;
108
109 int i, j;
110
111 for(i = 1; i <= cnt; i++) {
112
113 fu = Find(edge[i].u);
114
115 fv = Find(edge[i].v);
116
117 if (fu != fv) {
118
119 road += edge[i].len;
120
121 Union(fu, fv);
122
123 }
124
125 }
126
127 return road;
128
129 }
130
131
132
133 int main() {
134
135 int n;
136
137 while(~scanf("%d", &n)) {
138
139 Clear();
140
141 Build_Map(n);
142
143 sort(edge + 1, edge + cnt + 1,cmp);
144
145 printf("%d\n", MLT());
146
147 }
148
149 return 0;
150
151 }
152
153
154
posted @ 2011-07-20 16:25  cloehui  阅读(264)  评论(0编辑  收藏  举报