想看更多的解题报告: http://iyenn.com/rec/1824570.html
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:有n个型号,每个型号有7个字母代表其型号,每个型号之间的差异是他们字符串中对应字母不同的个数d[ta,tb]代表a,b之间的差异数
问1/Σ(to,td)d(to,td)最大值
解题思路:根据题意,即分母最小,这样就转换为一个典型的求最小生成树
- /*
- prim
- Memory 15584K
- Time 360MS
- */
- #include
- 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
- vis[i]=0;
- d[i]=map[0][i];
- }
-
- for(i=1;i<=n;i++){
- tmp=INF;
- for(j=0;j
- if(!vis[j] && tmp>d[j]){
- tmp=d[j];
- v=j;
- }
- }
- vis[v]=1;
- for(j=0;j
- if(!vis[j] && d[j]>map[v][j]){
- d[j]=map[v][j];
- }
- }
- }
- for(d[0]=0,i=1;i
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
//这里map可以不用初始化,因为每个两个点都有值 - scanf("%s",s[i]);
- for(j=0;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;
- }
评论记录:
回复评论: