hdoj 1233 还是畅通工程---最小生成树---prime算法

Posted on 2013-07-26 19:08  冰天雪域  阅读(220)  评论(0编辑  收藏  举报

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

可以用Kruskal来做,不过当图的边比较稠密的时候用prime会更快一些。

AC代码:296MS

 

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int inf=0xffffff;
int dis[105],sum,n;
int weight[105][105];
void prime()
{
	bool visit[105];
	int pre[105];
	memset(visit,0,sizeof(visit));
	for(int i=1;i<=n;i++)
		{dis[i]=weight[1][i];pre[i]=1;}
	visit[1]=1;
	int index,mmin;
	for(int i=1;i<=n-1;i++)
	{
		mmin=inf;
		for(int j=1;j<=n;j++)
		{
			if(!visit[j] && dis[j]<mmin)
			{
				mmin=dis[j];
				index=j;
			}
		}
		visit[index]=1;
		sum+=weight[pre[index]][index];
		for(int i=1;i<=n;i++)
		{
			if(!visit[i] && weight[index][i]<dis[i])
			{
				dis[i]=weight[index][i];
				pre[i]=index;
			}
		}
	}	
}
int main()
{

	while(scanf("%d",&n))
	{
		if(n==0)break; 
		int m=n*(n-1)/2;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				weight[i][j]=inf;
		for(int i=0;i<m;i++)
		{
			int x,y,z;
			scanf("%d %d %d",&x,&y,&z);
			weight[x][y]=z;
			weight[y][x]=z;
		}
		sum=0;
		prime();
		cout<<sum<<endl;
	}
}


 

 

Copyright © 2024 冰天雪域
Powered by .NET 9.0 on Kubernetes