POJ 1789
来源:互联网 发布:淘宝联盟什么时候结算 编辑:程序博客网 时间:2024/05/19 00:52
//11163000c00h00g1789Accepted15844K657MSG++1411B2013-01-07 12:35:43 用kruskal的话需要计算边的个数没有prim方便#include<stdio.h>#include<stdlib.h>#include<string.h>int N;char input[2005][8];int quality(const char* a,const char* b){ int res=0; for(int i=0;i<7;i++){ if(a[i]!=b[i]) res++; } return res;}int dis[2005][2005];int d[2005];int vis[2005]; //起点设置为0int main(){ while(scanf("%d",&N)!=EOF){ if(N==0) break; memset(vis,0,sizeof(vis)); for(int i=0;i<N;i++) scanf("%s",input[i]); for(int i=0;i<N;i++) for(int j=0;j<N;j++){ if(i==j) dis[i][j]=0; else dis[i][j]=quality(input[i],input[j]); } for(int i=0;i<N;i++) d[i]=dis[0][i]; vis[0]=1; //循环次数 int min,v,res=0; for(int i=0;i<N-1;i++){ min=10000; //寻找最小值 for(int j=0;j<N;j++){ if(vis[j]==0&&d[j]<min){ min=d[j]; v=j; } } vis[v]=1; res+=min; //更新 for(int j=0;j<N;j++){ if(vis[j]==0&&dis[v][j]<d[j]){ d[j]=dis[v][j]; } } } printf("The highest possible quality is 1/%d.\n",res); } return 0;}