POJ 2485 Highways
裸的prim,不解释,直接上代码。
#include<stdio.h> #include<iostream> using namespace std; #include<queue> #include<math.h> #include<algorithm> #include<string.h> #include<stdlib.h> #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) ) #define repAE(p,q,i) for( int (i)=(p); (i)<=(q); ++(i) ) #define repD(p,q,i) for( int (i)=(p); (i)!=(q); --(i) ) #define repDE(p,q,i) for( int (i)=(p); (i)>=(q); --(i) ) #define range 510 struct node{ int f,t,dis; node(){} node( int _f , int _t , int _dis ) : f(_f) , t(_t) , dis(_dis) {} friend bool operator < ( node n1 , node n2 ) { return n2.dis < n1.dis; } }; int f[range]; int findset( int i ); int main() { int N,T; int dis; scanf("%d",&T); while(T--) { scanf("%d",&N) ; priority_queue<node> gray; repAE(1,N,i) { repAE(1,N,j) { scanf("%d",&dis); if(i != j) gray.push( node(i,j,dis) ); } } // krustra repA(0,range,i) f[i]=i; int p,q,minx=0; int total=0; node u; while(total != N-1 ) { u=gray.top(); gray.pop(); p=findset(u.f); q=findset(u.t); if(p != q) { ++total; f[q] = p ; if( u.dis > minx ) minx = u.dis ; } } printf("%d\n",minx); } return 0; } int findset( int i ) { if( i != f[i] ) f[i] = findset( f[i] ) ; return f[i] ; }
To Be The Best Of Yourself