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

 

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

导航