题目1017:还是畅通工程
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2998
解决:1498
-
题目描述:
-
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
-
输入:
-
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
-
输出:
-
对每个测试用例,在1行里输出最小的公路总长度。
-
样例输入:
-
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
-
样例输出:
-
3 5
import java.util.Arrays; import java.util.Scanner; public class Main{ static int Tree[] = new int[101]; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while( scanner.hasNext() ){ int n = scanner.nextInt(); if(n == 0) break; Arrays.fill(Tree, -1); int k = n*(n-1)/2; Edge edges[] = new Edge[k+1]; for (int i = 1; i <= k; i++) { edges[i] = new Edge(); edges[i].a = scanner.nextInt(); edges[i].b = scanner.nextInt(); edges[i].cost = scanner.nextInt(); } quickSortEdgeByCost(1,k,edges); int ans = 0; for (int i = 1; i <= k; i++) { int a = edges[i].a; int b = edges[i].b; int cost = edges[i].cost; a = findRoot(a); b = findRoot(b); if(a != b){ Tree[a] = b; ans += cost; } } System.out.println(ans); } } public static class Edge{ int a; int b; int cost; } public static int findRoot(int x){ if(Tree[x] == -1) return x; else{ int tmp = findRoot(Tree[x]); Tree[x] = tmp; return tmp; } } public static void quickSortEdgeByCost(int low, int high, Edge edges[]) { int key = edges[low].cost; int begin = low; int end = high; while(low < high){ while(edges[low].cost <= key && low < high){ low ++; } while(edges[high].cost > key && low < high){ high--; } if(low < high){ Edge temp = edges[low]; edges[low] =edges[high]; edges[high] = temp; } } if(edges[low].cost < key){ Edge temp = edges[low]; edges[low] =edges[begin]; edges[begin] = temp; } if(begin < low - 1){ quickSortEdgeByCost(begin, low-1, edges); } if(end > low){ quickSortEdgeByCost(low, end, edges); } } } /************************************************************** Problem: 1017 User: yihukurama Language: Java Result: Accepted Time:590 ms Memory:86000 kb ****************************************************************/