POJ 1258 Agri-Net
裸的prim,不解释,直接上代码。
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; 29 int dis; 30 31 while(scanf("%d",&N) != EOF) 32 { 33 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 minx += u.dis ; 58 } 59 } 60 printf("%d\n",minx); 61 } 62 return 0; 63 } 64 65 int findset( int i ) 66 { 67 if( i != f[i] ) 68 f[i] = findset( f[i] ) ; 69 return f[i] ; 70 }
To Be The Best Of Yourself