【POJ】1797 Heavy Transportation 二分+最短路

来源:互联网 发布:软件学徒招聘骗局 编辑:程序博客网 时间:2024/05/19 18:14

传送门:【POJ】1797 Heavy Transportation


题目分析:二分边权然后做最短路。


代码如下:


#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 = 1005 ;const int MAXH = 1000005 ;const int MAXE = 1000005 ;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 ++ ;}bool dijkstra ( int s , int t , int limit ) {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 ( e -> c >= limit && d[v] > d[u] + e -> c ) {d[v] = d[u] + e -> c ;q.push ( d[v] , v ) ;}}}return d[t] != INF ;}} G ;int n , m ;void solve () {int u , v , c ;int l = INF , r = 0 ;G.clear () ;scanf ( "%d%d" , &n , &m ) ;while ( m -- ) {scanf ( "%d%d%d" , &u , &v , &c ) ;G.addedge ( u , v , c ) ;G.addedge ( v , u , c ) ;if ( l > c ) l = c ;if ( c > r ) r = c ;}while ( l < r ) {int mid = ( l + r + 1 ) >> 1 ;if ( G.dijkstra ( 1 , n , mid ) ) l = mid ;else r = mid - 1 ;}printf ( "%d\n\n" , l ) ;}int main () {int T , cas = 0 ;scanf ( "%d" , &T ) ;while ( T -- ) {printf ( "Scenario #%d:\n" , ++ cas ) ;solve () ;}return 0 ;}


0 0
原创粉丝点击