Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19824    Accepted Submission(s): 
8449
#include<stdio.h>
#include<algorithm>
using namespace std;
int set[110];
struct record
{
	int beg;
	int end;
	int money;
}s[11000];
int find(int fa)
{
	int ch=fa;
	int t;
	while(fa!=set[fa])
	fa=set[fa];
	while(ch!=fa)
	{
		t=set[ch];
		set[ch]=fa;
		ch=t;
	}
	return fa;
}
void mix(int x,int y)
{
	int fx,fy;
	fx=find(x);
	fy=find(y);
	if(fx!=fy)
	set[fx]=fy;
}
bool cmp(record a,record b)
{
	return a.money<b.money;
}
int main()
{
	int city,road,n,m,j,i,sum;
	while(scanf("%d",&road)&&road!=0)
	{
		scanf("%d",&city);
		for(i=0;i<road;i++)
		{
			scanf("%d%d%d",&s[i].beg,&s[i].end,&s[i].money);
		}
		for(i=1;i<=city;i++)
		set[i]=i;
		sort(s,s+road,cmp);
		sum=0;
		for(i=0;i<road;i++)
		{
			if(find(s[i].beg)!=find(s[i].end))
			{
				mix(s[i].beg,s[i].end);
				sum+=s[i].money;
			}
		}
		j=0;
		for(i=1;i<=city;i++)
		{
			if(set[i]==i)
			j++;
			if(j>1)
			break;
		}
		if(j>1)
		printf("?\n");
		else
		printf("%d\n",sum);
	}
	return 0;
}
prime算法
#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f
int lowcost[110],map[110][110],visit[110];
int city;
void prime()
{
	int min,i,j,next,mincost=0;
	memset(visit,0,sizeof(visit));
	for(i=1;i<=city;i++)
	{
		lowcost[i]=map[1][i];
	}
	visit[1]=1;
	for(i=1;i<city;i++)
	{
		min=INF;
		for(j=1;j<=city;j++)
		{
			if(!visit[j]&&min>lowcost[j])
			{
				min=lowcost[j];
				next=j;
			}
		}
		if(min==INF)
		{
			printf("?\n");
			return ;
		}
		mincost+=min;
		visit[next]=1;
		for(j=1;j<=city;j++)
		{
			if(!visit[j]&&lowcost[j]>map[next][j])
			{
				lowcost[j]=map[next][j];
			}
		}
	}
	printf("%d\n",mincost);
}
int main()
{
	int road;
	int j,i,x,y,c;
	while(scanf("%d%d",&road,&city)&&road!=0)
	{
		memset(map,INF,sizeof(map));
		while(road--)
		{
		    scanf("%d%d%d",&x,&y,&c);
		    map[x][y]=map[y][x]=c;
		}
		prime();
	}
	return 0;
}
原文:http://www.cnblogs.com/tonghao/p/4487383.html