hdoj 1233 또는 원활 한 공정 - 최소 생 성 트 리 - prime 알고리즘

제목: http://acm.hdu.edu.cn/showproblem.php?pid=1233
Kruskal 로 만 들 수 있 지만 그림 의 가장자리 가 조밀 할 때 prime 를 사용 하 는 것 이 더 빠 릅 니 다.
AC 코드: 296 MS
 
#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;

	}

}

 

좋은 웹페이지 즐겨찾기