最小生成树的基本知识,此图很稠密,所以选用Prim算法要快,Prim O(n2),Kruckal O(elog2e),向此题,e代表边数,远大于n,顶点数,所以选Prim
#include <iostream> using namespace std; const int maxn=2001; char s[maxn][7]; int edge[maxn][maxn]; int lit[maxn]; int chan(int a,int b) { int amou=0; for(int i=0;i<7;i++) { if(s[a][i]!=s[b][i]) amou++; } if(amou) return amou; else return 10; } int main() { int n; while(cin>>n&&n) { int i,j; for(i=0;i<n;i++) cin>>s[i]; for(i=0;i<n;i++) { for(j=0;j<n;j++) { edge[i][j]=chan(i,j); } } for(i=1;i<n;i++) lit[i]=edge[0][i]; int t=1,min,k; int tot=0; for(;t<n;t++) { min=10; for(i=0;i<n;i++) { if(lit[i]&&lit[i]<min) { min=lit[i]; k=i; } } lit[k]=0; tot+=min; for(i=0;i<n;i++) { if(edge[k][i]<lit[i]) lit[i]=edge[k][i]; } } printf("The highest possible quality is 1/%d.\n",tot); } return 0; }