mfgnik

Untitled

Nov 26th, 2020
634
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4. #include <algorithm>
  5. #include <queue>
  6. int N;
  7. using namespace std;
  8. /*
  9. void Dijkstra() { // O(n^2 + m) для полных графов
  10.     int d[N];
  11.     bool used[N];
  12.     vector<vector<pair<int, int>>> g;
  13.     for (int it = 0; it < N; ++it) {
  14.         int v = -1;
  15.         for (int i = 0; i < N; ++i) {
  16.             if (!used[i] && (v == -1 || d[i] < d[v])) {
  17.                 v = i;
  18.             }
  19.         }
  20.         if (d[v] == INT_MAX) {
  21.             break;
  22.         }
  23.         used[v] = true;
  24.         for (auto[to, w] : g[v]) {
  25.             if (d[to] > d[v] + w) {
  26.                 d[to] = d[to] + w;
  27.             }
  28.         }
  29.     }
  30.  
  31. }*/
  32. struct vertex {
  33.     int num;
  34.     int weight;
  35. };
  36.  
  37. void Dijkstra2(int s, vector<vector<vertex>>& g) { // O(m log n + n log n)
  38.     vector<int> d(N, INT_MAX);
  39.     priority_queue<pair<int, int>> q;
  40.     vector<int> p(N, -1);
  41.     d[s] = 0;
  42.     q.emplace(d[s], s);
  43.     while (!q.empty()) {
  44.         int v = q.top().second;
  45.         q.pop();
  46.         for (auto& [to, w] : g[v]) {
  47.             if (d[to] > d[v] + w && d[v] != INT_MAX) {
  48.                 p[to] = v;
  49.                 d[to] = d[v] + w;
  50.                 q.emplace(d[to], to);
  51.             }
  52.         }
  53.     }
  54.     if (p[N - 1] == -1) {
  55.         cout << -1;
  56.         return;
  57.     }
  58.     vector<int> ans;
  59.     for (int i = N - 1; i > 0; i = p[i]) {
  60.         ans.push_back(i);
  61.     }
  62.     ans.push_back(0);
  63.     reverse(ans.begin(), ans.end());
  64.     for (int i : ans) {
  65.         cout << i + 1 << " ";
  66.     }
  67. }
  68.  
  69. void Floyd() {
  70.     vector<vector<vector<int>>> d(N, vector<vector<int>>(N, vector<int>(N)));
  71.     for (int i = 0; i < N; ++i) {
  72.         d[0][i][i] = 0;
  73.     }
  74. }
  75. int main() {
  76.     int m, u, c, b;
  77.     vertex a;
  78.     cin >> N >> m;
  79.     vector<vector<vertex>> g(N);
  80.     for (int i = 0; i < m; ++i) {
  81.         cin >> u >> c >> b;
  82.         a.num = c - 1;
  83.         a.weight = b;
  84.         g[u - 1].emplace_back(a);
  85.         a.num = u - 1;
  86.         g[c - 1].emplace_back(a);
  87.     }
  88.     Dijkstra2(0, g);
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment