POJ 1258 Agri-Net

这一题是比较裸的最小生成树的题,用邻接表记录数据。我是用kruscal算法做的,思路比较简单,中间用并查集判断是否产生回路。

AC code:

 1 #include <iostream>
2 #include <stdlib.h>
3 #include <algorithm>
4 #define MAX 200
5 #define MAXN 10000
6 using namespace std;
7
8 struct line{
9 int start, end, len;
10 };
11
12 struct line lines[MAXN];
13 int map[MAX][MAX];
14 int father[MAX];
15 int linenum, minlen;
16
17 int cmp(line a, line b)
18 {
19 return a.len<b.len?1:0;
20 }
21 void ini(int n)//邻接表记录数据
22 {
23 linenum = 0;
24 int i, j;
25 for(i = 0; i < n; i++)father[i] = i;
26 for(i = 0; i < n; i++)
27 for(j = 0; j < n; j++)
28 scanf("%d", &map[i][j]);
29 for(i = 0; i < n - 1; i++)
30 {
31 for(j = i+1; j <= n -1; j++)
32 {
33 lines[linenum].start = i;
34 lines[linenum].end = j;
35 lines[linenum++].len = map[i][j];
36 }
37 }
38 sort(lines, lines+linenum, cmp);
39 }
40 int find(int k)//使用并查集判断是否产生回路
41 {
42 return k == father[k]? k:father[k] = find(father[k]);
43 }
44 int kruskal(int n)//排序后用kruscal算法
45 {
46 minlen = 0;
47 int a, b, i;
48 for(i = 0; i < linenum; i++)
49 {
50 a = find(lines[i].start);
51 b = find(lines[i].end);
52 if(a != b)
53 {
54 father[a] = b;
55 minlen+=lines[i].len;
56 }
57 }
58 return minlen;
59 }
60
61
62 int main()
63 {
64 int n;
65 while(scanf("%d", &n)!=EOF)
66 {
67 ini(n);
68 printf("%d\n", kruskal(n));
69 }
70 return 0;
71 }



posted @ 2012-02-24 14:22  背着超人飞  阅读(113)  评论(0)    收藏  举报