Advertisement
AlexGo11

Untitled

Jan 2nd, 2020
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.28 KB | None | 0 0
  1. //BFS и алгоритм Дейкстры. Теория. Задача D.
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. int n, m, start, finish;
  5. vector < vector < pair < int , int > > > g;
  6. vector < int > dist;
  7. vector < int > from;
  8.  
  9. void Dijkstra() {
  10.     dist.resize(n, 1e9 + 7);
  11.     from.resize(n);
  12.     from[start] = -1;
  13.     dist[start] = 0;
  14.     set < pair < int , int > > s;
  15.     s.insert({0, start});
  16.     while (!s.empty()) {
  17.         auto c = *s.begin();
  18.         s.erase(s.begin());
  19.         int v = c.second;
  20.         for (auto e : g[v]) {
  21.             int u = e.first, d = e.second;
  22.             if (dist[u] > dist[v] + d) {
  23.                 s.erase({dist[u], u});
  24.                 dist[u] = dist[v] + d;
  25.                 from[u] = v;
  26.                 s.insert({dist[u], u});
  27.             }
  28.         }
  29.     }
  30. }
  31.  
  32. void print_way() {
  33.     if (dist[finish] == 1e9 + 7) {
  34.         cout << -1;
  35.         return;
  36.     }
  37.     cout << dist[finish] << endl;
  38.     vector < int > vs;
  39.     int v = finish;
  40.     while (from[v] != -1) {
  41.         vs.push_back(v);
  42.         v = from[v];
  43.     }
  44.     vs.push_back(start);
  45.     reverse(vs.begin(), vs.end());
  46.     for (auto u : vs) cout << u + 1 << " " ;
  47. }
  48.  
  49. int main() {
  50.     cin >> n >> m;
  51.     cin >> start >> finish;
  52.     start--; finish--;
  53.     g.resize(n);
  54.     for (int i = 0; i < m; i++) {
  55.         int a, b, c;
  56.         cin >> a >> b >> c;
  57.         a--; b--;
  58.         g[a].push_back({b, c});
  59.         g[b].push_back({a, c});
  60.     }
  61.     Dijkstra();
  62.     print_way();
  63.     return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement