【POJ】1724 ROADS 二维最短路
2014-08-25 15:40
537 查看
传送门:【POJ】1724 ROADS
题目分析:老老实实的用最短路写了,虽然dfs或者bfs更快。。
最短路就需要二维了,d[v][cost]表示从起点到v且花费为cost的最短路的长度,然后就是普通的最短路了。效率很低。
代码如下:
题目分析:老老实实的用最短路写了,虽然dfs或者bfs更快。。
最短路就需要二维了,d[v][cost]表示从起点到v且花费为cost的最短路的长度,然后就是普通的最短路了。效率很低。
代码如下:
#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 = 1000005 ; const int MAXE = 1000005 ; const int INF = 0x3f3f3f3f ; struct Edge { int v , w ; value_t c ; Edge* next ; } ; struct Heap { int v , idx , w ; Heap () {} Heap ( value_t v , int idx , int w ) : v ( v ) , idx ( idx ) , w ( w ) {} 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 , int w ) { h[point] = Heap ( v , idx , w ) ; maintain ( point ++ ) ; } void pop () { h[1] = h[-- point] ; maintain ( 1 ) ; } bool empty () { return point == 1 ; } int front () { return h[1].idx ; } Heap top () { return h[1] ; } } ; struct Shortest_Path_Algorithm { priority_queue q ; Edge E[MAXE] ; Edge* H[MAXN] ; Edge* cur ; value_t d[MAXN][10005] ; bool vis[MAXN][10005] ; void clear () { cur = E ; CLR ( H , 0 ) ; } void addedge ( int u , int v , value_t c , int w ) { cur -> v = v ; cur -> c = c ; cur -> w = w ; cur -> next = H[u] ; H[u] = cur ++ ; } void dijkstra ( int s , int K ) { q.clear () ; CLR ( vis , 0 ) ; CLR ( d , INF ) ; d[s][0] = 0 ; q.push ( d[s][0] , s , 0 ) ; while ( !q.empty () ) { Heap tmp = q.top () ; int u = tmp.idx ; int w = tmp.w ; q.pop () ; if ( vis[u][w] ) continue ; vis[u][w] = 1 ; travel ( e , H , u ) { int v = e -> v , cost = w + e -> w ; if ( cost <= K && d[v][cost] > d[u][w] + e -> c ) { d[v][cost] = d[u][w] + e -> c ; q.push ( d[v][cost] , v , cost ) ; } } } } } G ; int K , n , m ; void solve () { int u , v , c , w ; G.clear () ; while ( m -- ) { scanf ( "%d%d%d%d" , &u , &v , &c , &w ) ; G.addedge ( u , v , c , w ) ; } G.dijkstra ( 1 , K ) ; int ans = INF ; FOR ( i , 0 , K ) if ( ans > G.d [i] ) ans = G.d [i] ; printf ( "%d\n" , ans == INF ? -1 : ans ) ; } int main () { while ( ~scanf ( "%d%d%d" , &K , &n , &m ) ) solve () ; return 0 ; }
相关文章推荐
- Poj 1724 ROADS【二维限制最短路+SPFA】
- (poj 1724 ROADS)<二维最短路+DP>
- POJ 1724 ROADS 最短路 邻接表 + bfs +优先队列
- 【POJ 1724】Roads (限制最短路)
- POJ 1724 ROADS (有限制的最短路)
- POJ 1724 ROADS(bfs最短路)
- poj_1724 ROADS(有费用限制的最短路)
- POJ 1724 - ROADS 有限制的最短路,A*
- POJ 1724 ROADS(bfs最短路)
- Poj 1724 ROADS (搜索 最短路 BFS优先队列)
- POJ 1724 ROADS 带花费的最短路
- POJ 1724 二维费用最短路
- POJ 1724 ROADS 有条件最短路
- POJ 1724 ROADS 最短路 邻接表 + bfs +优先队列
- POJ 1724 ROADS 最短路
- POJ 1724 ROADS(费用最短路:优先队列+BFS)
- POJ 1724 ROADS (优先队列+最短路)
- 【poj 1724】 ROADS 最短路(dijkstra+优先队列)
- poj 1724 ROADS 加限制的最短路
- POJ 1724 ROADS(二维SPFA)