POJ 1789 Truck History

裸的最小树。

题目链接:http://poj.org/problem?id=1789

题目意思就是,所有的物品标号都有唯一ID,从P衍生到Q的花费是PQ编号中在同一位置而字母不同的个数。

直接用两层循环求出点对之间的最短路,krustra。

上代码。

 1 #include<stdio.h>
 2 #include<iostream>
 3 using namespace std;
 4 #include<queue>
 5 #include<math.h>
 6 #include<algorithm>
 7 #include<string.h>
 8 #include<stdlib.h>
 9 
10 #define repA(p,q,i)  for( int (i)=(p); (i)!=(q); ++(i) )
11 #define repAE(p,q,i)  for( int (i)=(p); (i)<=(q); ++(i) )
12 #define repD(p,q,i)  for( int (i)=(p); (i)!=(q); --(i) )
13 #define repDE(p,q,i)  for( int (i)=(p); (i)>=(q); --(i) )
14 #define range 510
15 struct node{
16        int f,t,dis;
17        node(){}
18        node( int _f , int _t , int _dis )
19            : f(_f) , t(_t) , dis(_dis) {}
20        friend bool operator < ( node n1 , node n2 )
21        {  return n2.dis < n1.dis;  }
22 };
23 
24 int f[range];
25 int findset( int i );
26 int main()
27 {
28     int N,T;
29     int dis;
30     scanf("%d",&T);
31     while(T--)
32     {
33         scanf("%d",&N) ;
34         priority_queue<node>  gray;
35         repAE(1,N,i)
36         {
37             repAE(1,N,j)
38             {
39                 scanf("%d",&dis);
40                 if(i != j)
41                   gray.push( node(i,j,dis) );
42             } 
43         }
44         //  krustra
45         repA(0,range,i)  f[i]=i;
46         int p,q,minx=0;
47         int total=0;
48         node u;
49         while(total != N-1 )
50         {
51             u=gray.top();    gray.pop();
52             p=findset(u.f);  q=findset(u.t);
53             if(p != q) 
54             {
55                  ++total;
56                  f[q] = p ;
57                  if( u.dis > minx )
58                     minx = u.dis ;
59             }
60         }
61         printf("%d\n",minx);
62     }
63     return 0;
64 }
65 
66 int findset( int i )
67 {
68     if( i != f[i] )
69       f[i] = findset( f[i] ) ;
70     return f[i] ;
71 }
View Code

 

posted on 2013-09-06 21:45  码农之上~  阅读(201)  评论(0编辑  收藏  举报

导航