poj 1789

最小生成树的基本知识,此图很稠密,所以选用Prim算法要快,Prim O(n2),Kruckal O(elog2e),向此题,e代表边数,远大于n,顶点数,所以选Prim

#include <iostream>
using namespace std;
const int maxn=2001;
char s[maxn][7];
int edge[maxn][maxn];
int lit[maxn];
int chan(int a,int b)
{
	int amou=0;
	for(int i=0;i<7;i++)
	{
		if(s[a][i]!=s[b][i]) amou++;
	}
	if(amou) return amou;
	else return 10;
}
int main()
{
	int n;
	while(cin>>n&&n)
	{
		int i,j;
		for(i=0;i<n;i++)
			cin>>s[i];
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				edge[i][j]=chan(i,j);
			}
		}
		for(i=1;i<n;i++)
			lit[i]=edge[0][i];
		int t=1,min,k;
		int tot=0;
		for(;t<n;t++)
		{
			min=10;
			for(i=0;i<n;i++)
			{
				if(lit[i]&&lit[i]<min)
				{
					min=lit[i];
					k=i;
				}
			}
			lit[k]=0;
			tot+=min;
			for(i=0;i<n;i++)
			{
				if(edge[k][i]<lit[i])
					lit[i]=edge[k][i];
			}
		}
		printf("The highest possible quality is 1/%d.\n",tot);
	}
	return 0;
}


posted @ 2012-10-25 20:27  LJ_COME!!!!!  阅读(156)  评论(0编辑  收藏  举报