hdu 1233 - 还是畅通工程(MST)

还是畅通工程

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

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 Huge input, scanf is recommended.

Source

浙大计算机研究生复试上机考试-2006年

题解:

求解最小生成树。

#include<stdlib.h>  
#include<stdio.h>  
#include<string.h>  
#define INF 10000001 
#define maxn 101 
int map[maxn][maxn]; 
int cost[maxn]; 
int chosed[maxn]; 
int count; 
long total_cost;  
void init_map(int n){  
	int i,j;  
	for(i=1;i<=n;i++)  
		for(j=1;j<=n;j++)  
			map[i][j]=(i==j?0:INF);  
}  
void init(int n){  
	int i; 
	memset( chosed , 0 , sizeof(chosed)); 
	chosed[1]=1; 
	count=1;  
	for( i = 1 ; i <= n ; i++ ) 
		cost[i] = map[1][i]; 
} 
void prim(int n){ 
	int min,min_idx; 
	int i;  
	total_cost=0; 
	while( count <=n ){ 
		min = INF; 
		for( i = 2 ; i <= n ; i++ ){ 
			if( !chosed[i] && cost[i] < min){ 
				min_idx=i; 
				min=cost[i];  
			} 
		}
		if( min == INF )  return;  
		chosed[min_idx]=1;  
		total_cost+=min; 
		count++; 
		for( i = 1 ; i <= n ; i++) 
			if(!chosed[i]&& map[min_idx][i]<cost[i]) 
				cost[i] = map[min_idx][i];   
	}  
	int main(){  
		int road,node,i; 
		while(scanf("%d",&node)!=EOF&& node ){ 
			road=(node-1)*node/2; 
			init_map(node);  
			count=0; 
			while(road--){  
				int a,b,c;  
				scanf("%d %d %d",&a,&b,&c); 
				map[a][b]=c; 
				map[b][a]=c;  
			}  
			init(node);  
			prim(node);  
			printf("%ld\n",total_cost);  
		}  
	}
posted @ 2014-03-08 22:25  姜楠  阅读(242)  评论(0编辑  收藏  举报