题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233

 

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

 

不多说,prime链接表:

 


 
#include<stdio.h>
#include<string.h>
#include<math.h>

#include<queue>
#include<stack>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;

#define ll long long
#define da    10000000
#define xiao -10000000
#define clean(a,b) memset(a,b,sizeof(a))

struct ac{
	int num;
	int l;
};

vector<ac> home[105];
bool biaoji[105];
int shuaxin[105];
int n,zhen,sum;

void prime(int x)
{
	int i,j;
	clean(biaoji,0);
	for(i=0;i<105;++i)
		shuaxin[i]=da;
	sum=0;
	shuaxin[x]=0;
	for(i=1;i<=n;++i)
	{
		int can,min=da;
		for(j=1;j<=n;++j)
		{
			if(biaoji[j]==0&&shuaxin[j]<min)
			{
				can=j;
				min=shuaxin[j];
			}
		}
		biaoji[can]=1;
		sum=sum+shuaxin[can];
		for(j=0;j<home[can].size();++j)
		{
			int num=home[can][j].num;
			if(biaoji[num]==0&&home[can][j].l<shuaxin[num])
				shuaxin[num]=home[can][j].l;
		}
	}
}

int main()
{
	while(~scanf("%d",&n))
	{
		if(n==0)
			break;
		int i,j;
		zhen=n*(n-1)/2;
		for(i=0;i<zhen;++i)
		{
			int x,y,l;
			scanf("%d%d%d",&x,&y,&l);
			ac one,two;
			one.num=x;
			one.l=l;
			two.num=y;
			two.l=l;
			home[x].push_back(two);
			home[y].push_back(one);
		}
		prime(1);
		printf("%d\n",sum);
		for(i=0;i<105;++i)
			home[i].clear();
	}
}