您的位置:首页 > 理论基础

题目1017:还是畅通工程(2006年浙江大学计算机及软件工程研究生机试真题)

2014-05-29 18:42 591 查看
题目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
****************************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐