POJ 1251 Jungle Roads
这一题算是比较裸的最小生成树的题,用kruscal很好做,再加上并查集优化就没问题了。
AC code:
1 #include <iostream>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <algorithm>
5 using namespace std;
6 struct Line{
7 int start; int end; int lenth;
8 }line[1000];
9 int n, linenumber, minlenth;
10 int father[1000];
11 int cmp(Line a, Line b)
12 {
13 return a.lenth < b.lenth ? 1 : 0;
14 }
15 void ini()
16 {
17 int i,j;
18 char a, b;
19 linenumber = 0;
20 for(i = 0; i < n; i++)father[i] = i;
21 for(i = 0; i < n - 1; i++)
22 {
23 int temp;
24 cin >> a >> temp;
25 for(j = 0; j < temp; j++)
26 {
27 cin >> b >> line[linenumber].lenth;
28 line[linenumber].start = a - 'A';
29 line[linenumber++].end = b - 'A';
30 }
31 }
32 sort(line, line + linenumber, cmp);
33 }
34 int find(int k)//用并查集判断是否产生回路
35 {
36 return k == father[k] ? k : father[k] = find(father[k]);
37 }
38 int kruscal()//排序后用kruscal算法
39 {
40 int i;
41 int a, b;
42 minlenth = 0;
43 for(i = 0; i < linenumber; i++)
44 {
45 a = find(line[i].start); b = find(line[i].end);
46 if(a != b)//没有产生回路,此路可用
47 {
48 father[a] = b;
49 minlenth += line[i].lenth;
50 }
51 }
52 return minlenth;
53 }
54
55 int main()
56 {
57 while(cin >> n && n)
58 {
59 ini();
60 printf("%d\n", kruscal());
61 }
62 return 0;
63 }