最小生成树的基本知识,此图很稠密,所以选用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;
}