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 }
To Be The Best Of Yourself