每个字符串可看成一点,每两个字符串不相同的字母的数量可看成两点之间的距离。
求1/Q的最大值即相当于求最小生成树,用prim即可。
#include<iostream> #include<stdio.h> #include<string.h> #define MAXD 2010 #define INF 0x3f3f3f3f using namespace std; int N,graph[MAXD][MAXD],res; char data[MAXD][8]; void MST_PRIM() { int key[MAXD],flag,p; bool vis[MAXD]; memset(vis,0,sizeof(vis)); memset(key,0x3f,sizeof(key)); key[1]=0; int i,j; for(i=1;i<=N;i++) key[i]=graph[1][i]; vis[1]=true; res=0; for(i=1;i<N;i++) { flag=INF,p=-1; for(j=1;j<=N;j++) { if(!vis[j]&&key[j]<flag) { flag=key[j]; p=j; } } vis[p]=true; res+=flag; for(j=1;j<=N;j++) { if(!vis[j]&&key[j]>graph[p][j]) key[j]=graph[p][j]; } } } int main() { //freopen("test.txt","r",stdin); while(scanf("%d",&N)!=EOF) { if(N==0) return 0; int i,j,k; for(i=1;i<=N;i++) { scanf("%s",data[i]); } memset(graph,0,sizeof(graph)); for(i=1;i<=N;i++) { for(j=i+1;j<=N;j++) { for(k=0;k<8;k++) { if(data[i][k]!=data[j][k]) graph[i][j]++; } graph[j][i]=graph[i][j]; } } MST_PRIM(); printf("The highest possible quality is 1/%d.\n",res); } return 0; }