HDOJ1233 - 还是畅通工程

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 18878    Accepted Submission(s): 8388


Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
 

 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
 

 

Output
对每个测试用例,在1行里输出最小的公路总长度。
 

 

Sample Input
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
 

 

Sample Output
3 5
Hint
Hint
Huge input, scanf is recommended.
 

 

Source
 

 

Recommend
JGShining
 
 1 /********************************************************************
 2 *最小生成树Kruskal算法
 3 *功能:    给定一个带权图,求其最小生成子树,使用Kruskal算法和并查集
 4 *********************************************************************/
 5 #define EDGE_SIZE 5000
 6 #define NODE_SIZE 105
 7 
 8 struct edge{
 9     int s, e;
10     int cost;
11 };
12 
13 edge e[EDGE_SIZE];  // 边集
14 int bin[NODE_SIZE]; // 并查集--集合
15 
16 int cmp(const void *a, const void *b)
17 {
18     return ((edge *)a)->cost - ((edge *)b)->cost;
19 }
20 
21 void kruskal_init(int size)
22 { //初始化集合,只有当bin[i] == i时,代表有集合i
23     for (int i = 1; i <= size; i++) bin[i] = i;
24 
25     return ;
26 }
27 
28 int kruskal_find(int x)
29 {// 查找元素x所属的集合
30     int r = x;
31 
32     while (r != bin[r]) r = bin[r];
33 
34     return r;
35 }
36 
37 int kruskal_merge(int x, int y)
38 {// 将x 和 y的集合合并
39     int m, n;
40 
41     m = kruskal_find(x);
42     n = kruskal_find(y);
43 
44     if (m != n) {
45         bin[m] = n; //  将集合n中的元素合并到m中
46         return 1;
47     }
48 
49     return 0;
50 }
51 
52 int main(int argc, const char *argv[])
53 {
54     int n, m;
55     int max;
56     int i;
57 
58     #ifdef _REOPEN
59     freopen("1.txt", "r", stdin);
60     #endif // _REOPEN
61 
62     while (scanf("%d", &n) != EOF && n) {
63         m = n * (n - 1) / 2;
64         max = 0;
65         for (i = 1; i <= m; i++) {
66             scanf("%d %d %d", &e[i].s, &e[i].e, &e[i].cost);
67         }
68 
69         kruskal_init(n);   //初始化并查集
70 
71         qsort(e+1, m, sizeof(edge), cmp);
72 
73         for (i = 1; i <= m; i++) {
74             if (kruskal_merge(e[i].s, e[i].e)) max += e[i].cost;
75         }
76 
77         printf("%d\n", max);
78     }
79 
80     return 0;
81 }
View Code

 

posted @ 2013-05-28 17:25  楼兰故居  阅读(120)  评论(0)    收藏  举报