思路:
代码:
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 2005;
int N;
int ans;
bool vis[maxn];
int dis[maxn];
int mp[maxn][maxn];
char type[maxn][7];
struct NODE{
int id;
int dis;
NODE(int id , int dis) : id(id) , dis(dis) {} ;
friend bool operator > (NODE a , NODE b)
{
return a.dis > b.dis;
}
};
priority_queue<NODE , vector<NODE> , greater<NODE> > Q;
void INIT(){
ans = 0;
memset(dis , INF , sizeof(dis));
memset(vis , 0 , sizeof(vis));
return ;
}
void PRIM(){
dis[1] = 0;
Q.push(NODE(1 , 0));
while(Q.size()){
NODE cur = Q.top() ; Q.pop() ;
int id = cur.id ;
if(vis[id])
continue;
ans += dis[id];
vis[id] = true;
for(int i=1;i<=N;i++)
if(!vis[i] && dis[i] > mp[id][i]){
dis[i] = mp[id][i];
Q.push(NODE(i , dis[i]));
}
}
return ;
}
int main(){
while(~scanf("%d" , &N) && N){
INIT();
getchar();
for(int i=1;i<=N;i++)
gets(type[i]);
for(int i=1;i<=N;i++){
for(int j=i;j<=N;j++){
int tp = 0;
for(int t=0;t<7;t++)
if(type[i][t] != type[j][t])
tp++;
mp[i][j] = mp[j][i] = tp;
}
}
PRIM();
printf("The highest possible quality is 1/%d.\n" , ans);
}
return 0;
}