给你一个n;
n个长为7的字符串;
每个字符串表示一个节点,每个节点向其他所有点都有边,边长为两个节点字符串同一位置不同字符的数量;
需要你生成最短路的边权和。
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; #define INF 0x3f3f3f3f int mp[2005][2005]; char str[2005][8]; int n; void change(){ for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ int sum=0; for(int k=0;k<7;k++){ if(str[i][k]!=str[j][k]) sum++; } mp[i][j]=mp[j][i]=sum; } } } int prim(int st){ int vis[2005]; int low[2005]; int mincost=0; memset(vis,0,sizeof(vis)); vis[st]=1; for(int i=0;i<n;i++){ low[i]=mp[st][i]; } low[st]=0; for(int i=0;i<n-1;i++) { int minn=INF; int u=-1; for(int j=0;j<n;j++){ if(minn>low[j]&&!vis[j]){ minn=low[j]; u=j; } } if(minn==INF)return -1; vis[u]=1; mincost+=minn; for(int k=0;k<n;k++){ if(!vis[k]&&low[k]>mp[u][k]) { low[k]=mp[u][k]; } } } return mincost; } int main(){ while(scanf("%d",&n)&&n){ for(int i=0;i<n;i++) for(int j=0;j<n;j++) mp[i][j]=(i==j?0:INF); for(int i=0;i<n;i++){ scanf("%s",str[i]); } change(); printf("The highest possible quality is 1/%d.\n",prim(0)); } return 0; }