【POJ】1502 MPI Maelstrom 最短路

来源:互联网 发布:linux 父目录 编辑:程序博客网 时间:2024/06/05 10:38

传送门:【POJ】1502 MPI Maelstrom


题目分析:英语捉急了,题目超级简单。。就是求以1为起点的到其他所有顶点的最短路中最长的一条的长度。


代码如下:


#include <cmath>#include <cstdio>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int i = ( a ) ; i < ( b ) ; ++ i )#define FOR( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )#define REV( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )#define travel( e , H , u ) for ( Edge* e = H[u] ; e ; e = e -> next )#define CLR( a , x ) memset ( a , x , sizeof a )typedef int value_t ;const int MAXN = 105 ;const int MAXH = 20005 ;const int MAXE = 20005 ;const int INF = 0x3f3f3f3f ;struct Edge {int v ;value_t c ;Edge* next ;} ;struct Heap {int v , idx ;Heap () {}Heap ( value_t v , int idx ) : v ( v ) , idx ( idx ) {}bool operator < ( const Heap& a ) const {return v < a.v ;}} ;struct priority_queue {Heap h[MAXH] ;int point ;priority_queue () : point ( 1 ) {}void clear () {point = 1 ;}void maintain ( int o ) {int p = o , l = o << 1 , r = o << 1 | 1 ;while ( o > 1 && h[o] < h[o >> 1] ) {swap ( h[o] , h[o >> 1] ) ;o >>= 1 ;}o = p ;while ( 1 ) {if ( l < point && h[l] < h[p] ) p = l ;if ( r < point && h[r] < h[p] ) p = r ;if ( o == p ) break ;swap ( h[o] , h[p] ) ;o = p , l = o << 1 , r = o << 1 | 1 ;}}void push ( value_t v , int idx ) {h[point] = Heap ( v , idx ) ;maintain ( point ++ ) ;}void pop () {h[1] = h[-- point] ;maintain ( 1 ) ;}bool empty () {return point == 1 ;}int front () {return h[1].idx ;}} ;struct Shortest_Path_Algorithm {priority_queue q ;Edge E[MAXE] ;Edge* H[MAXN] ;Edge* cur ;value_t d[MAXN] ;bool vis[MAXN] ;void clear () {cur = E ;CLR ( H , 0 ) ;}void addedge ( int u , int v , value_t c ) {cur -> v = v ;cur -> c = c ;cur -> next = H[u] ;H[u] = cur ++ ;}void dijkstra ( int s ) {q.clear () ;CLR ( vis , 0 ) ;CLR ( d , INF ) ;d[s] = 0 ;q.push ( d[s] , s ) ;while ( !q.empty () ) {int u = q.front () ;q.pop () ;if ( vis[u] ) continue ;vis[u] = 1 ;travel ( e , H , u ) {int v = e -> v ;if ( d[v] > d[u] + e -> c ) {d[v] = d[u] + e -> c ;q.push ( d[v] , v ) ;}}}}} G ;int n ;void scanf ( int& x , char c = 0 ) {while ( ( c = getchar () ) != 'x' && ( c < '0' || c > '9' ) ) ;if ( c == 'x' ) x = INF ;else {x = c - '0' ;while ( ( c = getchar () ) >= '0' && c <= '9' ) x = x * 10 + c - '0' ;}}void solve () {int c ;G.clear () ;FOR ( i , 2 , n ) {FOR ( j , 1 , i - 1 ) {scanf ( c ) ;if ( c != INF ) {G.addedge ( i , j , c ) ;G.addedge ( j , i , c ) ;}}}G.dijkstra ( 1 ) ;int ans = 0 ;FOR ( i , 2 , n ) if ( G.d[i] > ans ) ans = G.d[i] ;printf ( "%d\n" , ans ) ;}int main () {while ( ~scanf ( "%d" , &n ) ) solve () ;return 0 ;}


0 0
原创粉丝点击