想到了最小生成树就很简单了。
注意输出后面有个“."。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 2005
using namespace std;
int Match(char a[],char b[])
{
int n=0,l=strlen(a);
for(int i=0; i<l; ++i)
if(a[i]!=b[i]) n++;
return n;
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
char str[MAXN][10]= {0};
getchar();
for(int i=0; i<n; ++i)
gets(str[i]);
int mincost[MAXN],ans=0;
bool used[MAXN];
memset(mincost,0x7f,sizeof(mincost));
memset(used,0,sizeof(used));
mincost[0]=0;
while(true)
{
int v=-1;
for(int i=0; i<n; ++i )
if(!used[i]&&(v==-1||mincost[i]<mincost[v]))
v=i;
if(v==-1) break;
used[v]=true;
ans+=mincost[v];
for(int i=0; i<n; ++i)
mincost[i]=min(mincost[i],Match(str[v],str[i]));
}
printf("The highest possible quality is 1/%d.\n",ans);
}
return 0;
}