#include<iostream>#include<cstring>usingnamespace std;int n;constint inf =0X3f3f3f3f;char str[2005][10];int mp[2005][2005];bool vis[2005];int dis[2005];intdistance(char a[],char b[]){int count =0;for(int i =0; i <7; i++){if(a[i]!= b[i]) count ++;}return count;}intprime(){int minn, u =1, sum =0;memset(vis,false,sizeof(vis));for(int i =1; i <= n; i++){
dis[i]= mp[1][i];}
vis[1]=true;for(int i =2; i <= n; i++){
minn = inf;for(int j =1; j <= n; j++){if(!vis[j]&& minn > dis[j]){
u = j;
minn = dis[j];}}
vis[u]=true;for(int j =1; j <= n; j++){if(!vis[j]&& dis[j]> mp[u][j]){
dis[j]= mp[u][j];}}}for(int i =2; i <= n; i++){
sum += dis[i];}return sum;}intmain(){while(cin >> n && n){for(int i =1; i <= n; i++){scanf("%s", str[i]);}for(int i =1; i < n; i++){for(int j = i +1; j <= n; j++){
mp[i][j]= mp[j][i]=distance(str[i], str[j]);}}
cout <<"The highest possible quality is 1/"<<prime()<<".\n";}return0;}
kruskal(用并查集)
#include<iostream>#include<cstring>#include<algorithm>#define MAX 2002000usingnamespace std;int parent[2002], n;char str[2002][10];struct node{int s, e, v;}g[MAX];intdistance(char a[],char b[]){int count =0;for(int i =0; i <7; i++){if(a[i]!= b[i]) count ++;}return count;}boolcmp(node a, node b){return a.v < b.v;}intfind(int x){return x == parent[x]? x : parent[x]=find(parent[x]);}boolunion_(int a,int b){int fa =find(a);int fb =find(b);if(fa != fb){
parent[fa]= fb;returntrue;}returnfalse;}intmain(){int temp;while(cin >> n && n){int k =0, sum =0;for(int i =0; i < n; i++){scanf("%s", str[i]);}for(int i =0; i < n -1; i++){for(int j = i +1; j < n; j++){
temp =distance(str[i], str[j]);
g[k].s = i;
g[k].e = j;
g[k].v = temp;
k ++;}}sort(g, g + k, cmp);for(int i =0; i <= n; i++){
parent[i]= i;}for(int i =0; i < k; i++){if(union_(g[i].s, g[i].e)){
sum += g[i].v;}}printf("The highest possible quality is 1/%d.\n", sum);}return0;}