标签:
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include <algorithm> 5 using namespace std; 6 const int MAXN=2010; 7 8 int pre[MAXN],anser,num,N; 9 10 struct Node{ 11 int s,e,dis; 12 }; 13 14 Node dt[MAXN*MAXN]; 15 char str[MAXN][10]; 16 17 int gd(char *a,char *b){ 18 int t=0; 19 for(int i=0;a[i];i++){ 20 if(a[i]!=b[i])t++; 21 } 22 return t; 23 } 24 25 int find(int x){ 26 //return pre[x]= x==pre[x]?x:find(pre[x]); 27 int r=x; 28 while(r!=pre[r])r=pre[r]; 29 int i=x,j; 30 while(i!=r)j=pre[i],pre[i]=r,i=j; 31 return r; 32 } 33 /*void merge(Node a){ 34 int f1,f2; 35 if(num==N)return; 36 if(pre[a.s]==-1)pre[a.s]=a.s; 37 if(pre[a.e]==-1)pre[a.e]=a.e; 38 f1=find(a.s);f2=find(a.e); 39 if(f1!=f2){num++; 40 pre[f1]=f2; 41 anser+=a.dis; 42 } 43 }*/ 44 void initial(){ 45 memset(pre,-1,sizeof(pre)); 46 //memset(dt,0,sizeof(dt)); 47 //memset(str,0,sizeof(str)); 48 anser=0; 49 } 50 51 //int cmp(const void *a,const void *b){ 52 // if((*(Node *)a).dis<(*(Node *)b).dis)return -1; 53 // else return 1; 54 //} 55 56 int cmp(Node a, Node b){ 57 return a.dis < b.dis; 58 } 59 60 int main(){ 61 while(scanf("%d",&N),N){ 62 num=1; 63 initial(); 64 for(int i=0;i<N;i++){ 65 scanf("%s",str[i]); 66 } 67 int k=0; 68 for(int i=0;i<N - 1;i++){ 69 for(int j=i+1;j<N;j++){ 70 dt[k].s=i; 71 dt[k].e=j; 72 dt[k].dis=gd(str[i],str[j]); 73 // printf("k==%d %d %d %d\n ",k,i,j,dt[k].dis); 74 k++; 75 } 76 } 77 sort(dt, dt + k, cmp); 78 //qsort(dt,k,sizeof(dt[0]),cmp); 79 int f1,f2; 80 for(int i=0;i<k;i++){ 81 if(pre[dt[i].s]==-1)pre[dt[i].s]=dt[i].s; 82 if(pre[dt[i].e]==-1)pre[dt[i].e]=dt[i].e; 83 f1=find(dt[i].s); 84 f2=find(dt[i].e); 85 if(f1!=f2){ 86 num++; 87 pre[f1]=f2; 88 anser+=dt[i].dis; 89 } 90 if(num==N)break; 91 //merge(dt[i]); 92 } 93 printf("The highest possible quality is 1/%d.\n",anser); 94 } 95 return 0; 96 }
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/4722389.html