最小生成树,稠密图,用Dijkstra算法AC是妥妥的。。
Kruscal过的。。g++会TLE C++可以AC,,
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define MAX 2100
using namespace std;
struct EDGE
{
int f,e;
int w;
}edge[MAX*MAX];
int uset[MAX];
bool cmp(EDGE a,EDGE b)
{
return a.w<b.w;
}
int init()
{
for(int i=0;i<MAX;++i)
uset[i]=i;
return 0;
}
int root(int k)
{
if(k==uset[k])return k;
else return uset[k]=root(uset[k]);
}
int kruscal(int m,int& ans)
{
sort(edge,edge+m,cmp);
ans=0;
int num=0;
init();
for(int k=0;k<m;++k)
{
int i=root(edge[k].f);
int j=root(edge[k].e);
if(i!=j)
{
ans+=edge[k].w;
uset[i]=j;
++num;
}
}
return ans;
}
int dis(char *a,char *b)
{
int cnt,i;
cnt=0;
for(i=0;i<7;i++)
if(a[i] != b[i])
cnt++;
return cnt;
}
int main()
{
int n,i,j,le;
char str[2100][8];
while (1)
{
scanf("%d",&n);
if (n == 0)
break;
le=0;
init();
getchar();
for (i=1; i<=n; i++)
scanf("%s",str[i]);
for (i=1; i<=n; i++)
{
for (j=1; j<=n; j++)
{
if (i == j)
continue;
edge[le].f=i;
edge[le].e=j;
edge[le].w=dis(str[i],str[j]);
le++;
}
}
printf("The highest possible quality is 1/%d.\n",kruscal(le,j));
}
}