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

题目: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;

	}

}


 

 

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