还是畅通工程

http://acm.hdu.edu.cn/showproblem.php?pid=1233

题目描述:
    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
输入:
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
    当N为0时,输入结束,该用例不被处理。
输出:
    对每个测试用例,在1行里输出最小的公路总长度。

 

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

计算最小生成树的带价,prim算法直接上


#include <stdio.h>
#define MAX 101
#define INF 0x7fffffff
#define START 1
typedef unsigned int UINT;
UINT A[MAX][MAX];
int visited[MAX];
void init(UINT n){
	UINT i,j;
	for(i = 0;i < n;i++){
		visited[i + 1] = 0;//i+1之前写成了i,让我WA了好多次
		for(j = 0;j < n;j++)
			A[i][j] = INF;
	}
}

int main(){
	UINT N,n,i,j,min_j;
	UINT a,b,matrix;
	UINT min,min_sum;
	UINT tmp[MAX],cnt;
	while(scanf("%d",&N) && N){
		init(N);
		n = N * (N - 1) >> 1;
		for(i = 1;i <= n;++i){
			scanf("%d%d%d",&a,&b,&matrix);
			A[a][b] = A[b][a] = matrix;
		}
		visited[START] = 1;
		min_sum = 0;
		tmp[0] = START;
		cnt = 1;
		while(cnt < N){
			min = INF;
			for(i = 0;i < cnt;i++){
				for(j = 1;j <= N;j++){
					if(!visited[j] && A[tmp[i]][j] < min){
						min = A[tmp[i]][j];
						min_j = j;
					}
				}
			}
			tmp[cnt] = min_j;
			cnt++;
			visited[min_j] = 1;
			min_sum = min_sum + min;
		}
		printf("%d\n",min_sum);
	}
	return 0;
}


你可能感兴趣的:(解题报告,还是畅通工程,浙大机试)