Advertisement
Oppenheimer

Dijkstra (SSSP,non neg edge) (with path print)

Aug 19th, 2022
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.08 KB | None | 0 0
  1. // O (V^2 +  E)
  2. const int INF = 1000000000;
  3. vector<vector<pair<int, int>>> adj;
  4.  
  5. void dijkstra(int s, vector<int> & d, vector<int> & p) {
  6.     int n = adj.size();
  7.     d.assign(n, INF);
  8.     p.assign(n, -1);
  9.     vector<bool> vis(n, false); // visited array
  10.  
  11.     d[s] = 0;
  12.     for (int i = 0; i < n; i++) {
  13.         int v = -1;
  14.         for (int j = 0; j < n; j++) {
  15.             if (vis[j] == false && (v == -1 || d[j] < d[v]))
  16.                 v = j;
  17.         }
  18.  
  19.         if (d[v] == INF)
  20.             break;
  21.  
  22.         vis[v] = true;
  23.         for (auto edge : adj[v]) {
  24.             int to = edge.first;
  25.             int len = edge.second;
  26.  
  27.             if (d[v] + len < d[to]) {
  28.                 d[to] = d[v] + len;
  29.                 p[to] = v;
  30.             }
  31.         }
  32.     }
  33. }
  34. // printing the path from source s (given) to vertex t
  35.  
  36. vector<int> restore_path(int s, int t, vector<int> const& p) {
  37.     vector<int> path;
  38.  
  39.     for (int v = t; v != s; v = p[v])
  40.         path.push_back(v);
  41.    
  42.    
  43.     path.push_back(s);
  44.  
  45.     reverse(path.begin(), path.end());
  46.     return path;
  47. }
  48.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement