最小生成树

H - 最小生成树
Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status


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



 


Sample Output


3

*/
   
   
   
   



#include <stdio.h>
#include <string.h>
#define MAX_N 1000
#define INF 0x3f3f3f3f
int g[MAX_N][MAX_N];
int used[MAX_N];
int dist[MAX_N];
int n,sum;
int a,b,c;
void add_edge(int a,int b,int c)
{
	if(g[a][b]>c)
	{
		g[a][b] = g[b][a] = c;
	}
}
void init()
{
	memset(used,0,sizeof(used));
	memset(dist,INF,sizeof(dist));
}
void Prim()
{
	init();
	dist[1] = 0;
	while(1)
	{
		int u = -1, i, v;
		int min = INF;
		for(i=1;i<=n;i++)
		{
			if(min>dist[i] && !used[i])
			{
				min = dist[i];
				u = i;
			}
		}
		used[u] = 1;
		if(u==-1)
		{
			break;
		}
		sum += dist[u];
		for(v=1;v<=n;v++)
		{
			if(g[u][v]!=INF && dist[v]> g[u][v])
			{
				dist[v] = g[u][v];
			}
		}
	}
	printf("%d\n",sum);
}
int main()
{
	while(scanf("%d",&n)&&n)
	{
		int i;
		memset(g,0x3f,sizeof(g));
		for(i=0;i<n*(n-1)/2;i++)
		{
			scanf("%d%d%d",&a,&b,&c);
			add_edge(a,b,c);
		}
		sum = 0;
		Prim();
	}
	return 0;
}

  
  
  
  

你可能感兴趣的:(最小生成树)