这题要把给的字符串变成边的权值
#include <cstdio> #include <iostream> #include <queue> #include <string> using namespace std; #define sf scanf #define pf printf #define debug printf("! ") #define blank printf(" ") #define mem(a,b) memset(a,b,sizeof(a)) const int MaxN = 2010; const int INF = 1<<27; int p[MaxN]; char str[2010][8]; int w[MaxN*MaxN],r[MaxN*MaxN],u[MaxN*MaxN],v[MaxN*MaxN]; int m,n; int find(int x){return p[x]==x?x:p[x]=find(p[x]);} int cmp(const int a,const int b) { return w[a]<w[b]; } int kruskal() { int ans = 0,i; for(i = 0;i<n;i++) p[i] = i; for(i = 0;i<m;i++) r[i] = i; sort(r,r+m,cmp); for(i = 0;i<m;i++) { int e = r[i]; int x = find(u[e]); int y = find(v[e]); if(x!=y) { ans+=w[e];p[x] = y; } } return ans; } int weight(int i,int j) { int w = 0,k; for(k = 0;k<7;k++) if(str[i][k]!=str[j][k]) w++; return w; } int main() { int i,j; while(~sf("%d",&n),n) { m = 0; mem(u,0); mem(v,0); mem(w,0); for(i = 0;i<n;i++) { sf("%s",str[i]); } for(i = 0;i<n;i++) { for(j=i+1;j<n;j++) { int tmp = weight(i,j); if(tmp==0) break; u[m] = i; v[m] = j; w[m++] = tmp; } } int ans = kruskal(); pf("The highest possible quality is 1/%d. ",ans); } return 0; }