Advertisement
Mirbek

Кратчайший путь

Jan 11th, 2022
689
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int N = 2e5 + 5;
  6. const int inf = 2e9;
  7.  
  8. int n, m, s, t;
  9. long long dist[N], par[N];
  10. vector < pair <int, int> > g[N];
  11.  
  12. int main(){
  13.  
  14.     for (int i = 0; i < N; i++) {
  15.         dist[i] = inf;
  16.     }
  17.  
  18.     cin >> n >> m >> s >> t;
  19.  
  20.     for (int i = 1; i <= m; i++) {
  21.         int u, v, len;
  22.         cin >> u >> v >> len;
  23.         g[u].push_back(make_pair(v, len));
  24.         g[v].push_back(make_pair(u, len));
  25.     }
  26.  
  27.     set < pair <int, int> > st;
  28.     dist[s] = 0;
  29.     st.insert({dist[s], s});
  30.  
  31.     while (!st.empty()) {
  32.         int v = st.begin()->second;
  33.         st.erase(st.begin());
  34.  
  35.         for (int i = 0; i < g[v].size(); i++) {
  36.             int to = g[v][i].first, len = g[v][i].second;
  37.             if (dist[v] + len < dist[to]) {
  38.                 st.erase({dist[to], to});
  39.                 dist[to] = dist[v] + len;
  40.                 par[to] = v;
  41.                 st.insert({dist[to], to});
  42.             }
  43.         }
  44.     }
  45.  
  46.     if (dist[t] == inf) {
  47.         cout << -1 << endl;
  48.     } else {
  49.         cout << dist[t] << endl;
  50.  
  51.         int x = t;
  52.         vector <int> path;
  53.         while (x != s) {
  54.             path.push_back(x);
  55.             x = par[x];
  56.         }
  57.  
  58.         path.push_back(s);
  59.         reverse(path.begin(), path.end());
  60.  
  61.         for (int x : path) {
  62.             cout << x << " ";
  63.         }
  64.     }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement