題目連接:http://poj.org/problem?id=2449ios
題目描述:ui
其實題目的大意就是求 第k短路, 存在就輸出, 不存在就輸出-1。 注意當起點和終點一致的時候,須要k++, 由於在OUTPUT時提到the length (time required) to welcome Princess Uyuw using the K-th shortest path。 能夠看出是須要時間的,而且並無描述相同點直接的時間爲0這一條件,所以在計算路徑的時候,爲0的路徑是不可以算到裏面的; 而求最短路的時候會計算一次,所以須要k++。spa
通常就是使用最短路+A*進行處理,A*能夠直接使用優先隊列進行維護便可。由於SPFA寫殘了, 調了很久。。。。、code
1 #include<cstdio>
2 #include<iostream>
3 #include<algorithm>
4 #include<queue>
5 #include<vector>
6 using namespace std ; 7 /*
8 題意就是求s->t 的第k短路, SPFA+A* 9 SPFA寫殘了,調了很久~~~~ 10 */
11 // 12 const int MAX_NODE = 1005 ; 13 const int MAX_EDGE = 1e5 + 5 ; 14 const int INF = 1e7 ; 15 int to[MAX_EDGE], next[MAX_EDGE], weight[MAX_EDGE], head[MAX_NODE] ; 16 int dis[MAX_NODE] ; 17 int edgeNum, s, t, k, n, m ; 18 int ff[MAX_EDGE], tt[MAX_EDGE], ww[MAX_EDGE] ; 19 queue <int> qu ; 20 bool vis[MAX_NODE] ; 21 // 22 void clear(){ 23 edgeNum = 0 ; 24 for( int i = 0; i < MAX_NODE; i++ ){ 25 head[i] = -1 ; 26 } 27 } 28 // 29 void addEdge(int u, int v, int w){ 30 to[edgeNum] = v ; 31 weight[edgeNum] = w ; 32 next[edgeNum] = head[u] ; 33 head[u] = edgeNum++ ; 34 } 35 // 36 void SPFA(){ 37 for( int i = 0; i <= n; i++ ){ 38 dis[i] = INF ; 39 vis[i] = false ; 40 } 41 //cout << dis[n] << " " << vis[n] << endl ;
42 while( !qu.empty() ) qu.pop() ; 43 qu.push(t) ; 44 vis[t] = true ; 45 dis[t] = 0 ; 46 while( !qu.empty() ){ 47 int u = qu.front() ; 48 qu.pop() ; 49 vis[u] = false ; 50 for( int edge = head[u]; edge != -1; edge = next[edge] ){ 51 if( dis[to[edge]] > dis[u]+weight[edge] ){ 52 dis[to[edge]] = dis[u] + weight[edge] ; 53 if( !vis[to[edge]] ){ 54 qu.push(to[edge]) ; 55 vis[to[edge]] = true ; 56 } 57 } 58 } 59 } 60 } 61 // 62 int solve(){ 63 clear() ; 64 for( int i = 0; i < m; i++ ){ 65 addEdge(tt[i], ff[i], ww[i]) ; 66 } 67 SPFA() ; 68 clear() ; 69 for( int i = 0; i < m; i++ ){ 70 addEdge(ff[i], tt[i], ww[i]) ; 71 } 72 if( dis[s] == INF ) return -1 ; 73 priority_queue < pair<int, int> > heap ; 74 while( !heap.empty() ) heap.pop() ; 75 heap.push(make_pair(-dis[s], s)) ; 76 while( !heap.empty() ){ 77 int val = heap.top().first ; 78 int u = heap.top().second ; 79 int res = -val - dis[u] ; 80 heap.pop() ; 81 if( u == t ){ 82 if( !--k ){ 83 return res ; 84 } 85 } 86 for( int edge = head[u]; edge != -1; edge = next[edge] ){ 87 heap.push(make_pair(-(res+weight[edge]+dis[to[edge]]), to[edge])) ; 88 } 89 } 90 return -1 ; 91 } 92 // 93 int main(){ 94 //freopen("1234.txt", "r", stdin) ;
95 scanf("%d%d", &n, &m) ; 96 int a, b, c ; 97 for( int i = 0; i < m; i++ ){ 98 scanf("%d%d%d", &a, &b, &c) ; 99 ff[i] = a ; tt[i] = b ; ww[i] = c ; 100 } 101 scanf("%d%d%d", &s, &t, &k) ; 102 if( s == t ) k++ ; 103 cout << solve() << endl ; 104 return 0 ; 105 }