题目大意:有n个型号,每个型号有7个字母代表其型号,每个型号之间的差异是他们字符串中对应字母不同的个数d[ta,tb]代表a,b之间的差异数
问1/Σ(to,td)d(to,td)最大值
解题思路:根据题意,即分母最小,这样就转换为一个典型的求最小生成树,每两个字符串找对应位置不一样的,距离为不一样的个数,然后找最小生成树就行了
#include <iostream>
#include <string.h>
using namespace std;
int t;
const int INF=0x3f3f3f3f;
const int maxn=2005;
bool vis[maxn];
int lowc[maxn];
int g[maxn][maxn];
char s[maxn][7];
int prim(int cost[][maxn],int n)
{
int ans=0;
memset(vis,false,sizeof(vis));
vis[0]=true;
for(int i=1;i<n;i++)
lowc[i]=cost[0][i];
for(int i=1;i<n;i++)
{
int minc=INF;
int p=-1;
for(int j=0;j<n;j++)
if(!vis[j]&&minc>lowc[j])
{
minc=lowc[j];
p=j;
}
ans+=minc;
vis[p]=true;
for(int j=0;j<n;j++)
if(!vis[j]&&lowc[j]>cost[p][j])
lowc[j]=cost[p][j];
}
return ans;
}
void init()
{
memset(s,0,sizeof(s));
memset(g,0,sizeof(g));
}
int main()
{
while(cin>>t)
{
init();
if(t==0)
break;
for(int i=0; i<t; i++)
{
cin>>s[i];
}
for(int i=0; i<t; i++)
for(int j=i+1; j<t; j++)
for(int k=0; k<7; k++)
{
if(s[i][k]!=s[j][k])
{
g[i][j]++;
g[j][i]++;
}
}
int sum=prim(g,t);
cout<<"The highest possible quality is 1/";
cout<<sum<<"."<<endl;
}
return 0;
}