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时,输入结束,该用例不被处理。
当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
Huge input, scanf is recommended.
Hint
Hint
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 }
浙公网安备 33010602011771号