poj 1789 Truck History

poj 1789 Truck History
竟然一次就过了。。。。真是罕见。。

http://acm.pku.edu.cn/JudgeOnline/problem?id=1789

题意 : 看discus了。。。。就是每个字符串相同位置,位置不同的,这样,这两个字符串的距离就+1。最后要求距离和倒数最大,就代表距离最小。所以最小生成树搞 克鲁斯卡尔 + 并查集合

没有变态数据,不过数据量貌似很大啊

 1  #include  < stdio.h >
 2  #include  < math.h >
 3  #include  < algorithm >
 4  #define  max 2001
 5  using   namespace  std;
 6  int  m, n, p[max];
 7  char  input[max][ 8 ];
 8  struct  E{
 9       int  u, v, w;
10  }e[ 4000000 ];
11  int  cmp(E a, E b){
12       return  a.w  >  b.w;
13  }
14  int  find( int  x){
15       if (x  !=  p[x]) return  p[x]  =  find(p[x]);
16       return  p[x];
17  }
18  int  main(){
19       int  i, j, u, v, dis, k, c, tc, res;
20       while (scanf( " %d " & m), m){
21          c  =  res  =   0 ;
22           for (i  =   0 ; i  <  max; i ++ )
23              p[i]  =  i;
24           for (i  =   1 ; i  <=  m; i ++ )
25              scanf( " %s " , input[i]);
26           for (i  =   1 ; i  <=  m; i ++ ){
27               for (j  =  i  +   1 ; j  <=  m; j ++ ){
28                  dis  =   0 ;
29                   if (i  !=  j){
30                       for (k  =   0 ; k  <   8 ; k ++ )
31                           if (input[i][k]  !=  input[j][k])dis ++ ;
32                       if (dis){
33                   //         printf("%d -> %d = %d\n", i, j, dis);
34                          e[c].u  =  i;
35                          e[c].v  =  j;
36                          e[c ++ ].w  =  dis;
37                      }
38                  }
39              }
40          }
41          tc  =  c;
42          make_heap(e, e  +  c, cmp);
43       //     printf("%d %d %d\n", e[0].u, e[0].v, e[0].w);
44           for (n  =   1 ; n  <  m; tc -- ){
45               if ( ! tc) break ;
46               if ((u  =  find(e[ 0 ].u))  !=  (v  =  find(e[ 0 ].v))){
47                  p[u]  =  v;n ++ ;
48                  res  +=  e[ 0 ].w;
49              }
50           //     printf("%d %d %d\n", e[0].u, e[0].v, e[0].w);
51              pop_heap(e, e  +  tc, cmp);
52          }
53          printf( " The highest possible quality is  " );
54           if (res)
55              printf( " 1/%d.\n " , res);
56           else  puts( " 0. " );
57      }
58       return   0 ;
59  }

你可能感兴趣的:(poj 1789 Truck History)