Advertisement
BotByte

Finding kth shortest path (uva-10740, dijkstra).cpp

Sep 12th, 2017
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. /* Finding k-th shortest path */
  2. /* Author : M. A. Rafsan Mazumder */
  3.  
  4. #include <bits/stdc++.h>
  5.  
  6. using namespace std;
  7.  
  8. #define MAX 105
  9. typedef pair<int, int> PII;
  10. int x, y, k;
  11. vector<pair<int, int> > adj[MAX];
  12. vector<int> dist[MAX];
  13.  
  14. void dijkstra(int s)
  15. {
  16.     priority_queue<PII, vector<PII>, greater<PII> > pq;
  17.     pq.push(make_pair(0, s));
  18.     while(!pq.empty()){
  19.         int u = pq.top().second;
  20.         int u_cost = pq.top().first;
  21.         pq.pop();
  22.         if(dist[u].size() == k) continue;
  23.         // In some cases there will be multiple edges between same nodes
  24.         // For those cases
  25.         /*else {
  26.             int len = dist[u].size();
  27.             if(len != 0){
  28.                 if(dist[u][len-1] == u_cost) continue;
  29.             }
  30.         }*/
  31.         dist[u].push_back(u_cost);
  32.         for(int i=0; i<adj[u].size(); i++){
  33.             int v = adj[u][i].first;
  34.             int u_to_v = adj[u][i].second;
  35.             if(dist[v].size() == k) continue;
  36.             pq.push(make_pair(u_cost + u_to_v, v));
  37.         }
  38.     }
  39. }
  40.  
  41. int main()
  42. {
  43.     //freopen("in.txt", "r", stdin);
  44.     int n, m;
  45.     while(scanf("%d %d", &n, &m)){
  46.         if(n == 0 && m == 0) break;
  47.         for(int i=0; i<MAX; i++){
  48.             adj[i].clear();
  49.             dist[i].clear();
  50.         }
  51.         scanf("%d %d %d", &x, &y, &k);
  52.         for(int i=0; i<m; i++){
  53.             int u, v, c;
  54.             scanf("%d %d %d", &u, &v, &c);
  55.             adj[u].push_back(make_pair(v, c));
  56.         }
  57.         dijkstra(x);
  58.         int res;
  59.         if(dist[y].size() < k) res = -1;
  60.         else res = dist[y][k-1];
  61.         printf("%d\n", res);
  62.     }
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement