想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:有n个型号,每个型号有7个字母代表其型号,每个型号之间的差异是他们字符串中对应字母不同的个数d[ta,tb]代表a,b之间的差异数
问1/Σ(to,td)d(to,td)最大值
解题思路:根据题意,即分母最小,这样就转换为一个典型的求最小生成树
/*
prim
Memory 15584K
Time 360MS
*/
#include <iostream>
using namespace std;
#define MAXV 2001
#define INF INT_MAX
int n;
char s[MAXV][8];
int map[MAXV][MAXV];
int d[MAXV];
bool vis[MAXV];
void prim(){
int i,j,v,tmp;
for(i=0;i<n;i++){
vis[i]=0;
d[i]=map[0][i];
}
for(i=1;i<=n;i++){
tmp=INF;
for(j=0;j<n;j++){
if(!vis[j] && tmp>d[j]){
tmp=d[j];
v=j;
}
}
vis[v]=1;
for(j=0;j<n;j++){
if(!vis[j] && d[j]>map[v][j]){
d[j]=map[v][j];
}
}
}
for(d[0]=0,i=1;i<n;i++) d[0]+=d[i];
printf("The highest possible quality is 1/%d.\n",d[0]);
}
int main(){
int i,j,k,num;
while(scanf("%d",&n) && n){
for(i=0;i<n;i++){ //这里map可以不用初始化,因为每个两个点都有值
scanf("%s",s[i]);
for(j=0;j<i;j++){
num=0;
for(k=0;k<7;k++)
if(s[i][k]!=s[j][k])
num++;
map[i][j]=map[j][i]=num;
}
}
prim();
}
return 0;
}