题意:给定N个字符串 每个字符串可以看为一个点 每个点之间都有边 长度为对应两点之间字符不同的个数 把这些点连接起来 求最小的边长
思路:Kruskal 算法的简单应用
#include<iostream>
#include<cstring>
using namespace std;
char a[2222][10];
int dist[2222];
int s[2222];
int n;
int e(int u,int v)
{
int l=0;
for(int i=0;i<7;i++)
if(a[u][i]!=a[v][i])
l++;
return l;
}
void Kruskal()
{
int sum=0;
int i,j;
dist[1]=0;
memset(s,0,sizeof(s));
for(i=2;i<=n;i++)
{
int l=0;
for(j=0;j<7;j++)
if(a[1][j]!=a[i][j])
l++;
dist[i]=l;
}
s[1]=1;
for(i=1;i<=n;i++)
{
int v=-1;
int min=999999999;
for(j=2;j<=n;j++)
{
if(dist[j]<min&&!s[j])
min=dist[j],v=j;
}
if(v==-1) break;
sum+=dist[v];
s[v]=1;dist[v]=0;
for(j=2;j<=n;j++)
{
if(dist[j]>e(v,j))
dist[j]=e(v,j);
}
}
printf("The highest possible quality is 1/%d.\n",sum);
}
int main()
{
int i;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(i=1;i<=n;i++)
scanf("%s",a[i]);
Kruskal();
}
return 0;
}