您的位置:首页 > 其它

poj1789 - Truck History

2012-09-14 19:38 309 查看
                                 
想看更多的解题报告: 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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ini 360