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 }
View Code

 

posted on 2013-09-07 18:50  码农之上~  阅读(153)  评论(0编辑  收藏  举报

导航