就是最小生成树,就记得第一次做的时候题意坑,但还是忘了到底是啥,这次还是没理解题意。
// #include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#define LL long long
#define maxn 2100
using namespace std;
char str[maxn][10];
int father[maxn];
struct Edge
{
int u,v,w;
void set(int u,int v,int w){ this->u=u;this->v=v;this->w=w;}
friend bool operator<(Edge A,Edge B)
{
return A.w<B.w;
}
}rd[maxn*maxn];
void add(char *str1,char *str2,int u,int v,int t)
{
int len=strlen(str1);
int dis=0;
for(int i=0;i<len;++i)
{
if(str1[i]!=str2[i])
dis++;
}
rd[t].set(u,v,dis);
return ;
}
int _find(int x)
{
int t=x;
while(x!=father[x])
x=father[x];
while(t!=father[t])
{
int temp=t;
t=father[t];
father[temp]=x;
}
return x ;
}
bool join(int x,int y)
{
x=_find(x);
y=_find(y);
if(x!=y)
{
father[x]=y;
return true;
}
return false;
}
int main()
{
int n;
while(scanf("%d",&n),n!=0)
{
for(int i=0;i<n;++i)
{
scanf("%s",str[i]);
}
int t=0;
for(int i=0;i<n-1;++i)
{
for(int j=i+1;j<n;++j)
{
add(str[i],str[j],i,j,t++);
}
}
for(int i=0;i<=n;++i)
{
father[i]=i;
}
sort(rd,rd+t);
int ans=0;
for(int i=0;i<t;++i)
{
if(join(rd[i].u,rd[i].v))
{
ans+=rd[i].w;
}
}
if(ans!=1)
printf("The highest possible quality is 1/%d.\n",ans);
else
printf("The highest possible quality is 1.\n");
}
}