Mahmoud_Hawara

Dijkstra

Nov 28th, 2025
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1e5;
  5.  
  6. int n, m;
  7. vector<pair<int, int>> g[N];
  8.  
  9. pair<vector<int>, vector<int>> dijkstra(int s) {
  10.     vector<int> dis(n + 1, INT_MAX), par(n + 1, -1);
  11.     priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
  12.     dis[s] = 0;
  13.     pq.push({0, s});
  14.     while (!pq.empty()) {
  15.         auto [d, u] = pq.top();
  16.         pq.pop();
  17.         if (dis[u] < d) continue;
  18.         for (auto [v, w] : g[u]) {
  19.             if (d + w < dis[v]) {
  20.                 dis[v] = d + w;
  21.                 pq.push({dis[v], v});
  22.                 par[v] = u;
  23.             }
  24.         }
  25.     }
  26.     return {dis, par};
  27. }
  28.  
  29. void solve()
  30. {
  31.     cin >> n >> m;
  32.     for (int i = 1; i <= m; i++) {
  33.         int u, v, w;
  34.         cin >> u >> v >> w;
  35.         g[u].push_back({v, w});
  36.         g[v].push_back({u, w});
  37.     }
  38.     auto [dis, par] = dijkstra(1);
  39.     int q;
  40.     cin >> q;
  41.     while (q--) {
  42.         int d;
  43.         cin >> d;
  44.         cout << dis[d] << '\t';
  45.         vector<int> path;
  46.         while (d != -1) {
  47.             path.push_back(d);
  48.             d = par[d];
  49.         }
  50.         reverse(path.begin(), path.end());
  51.         for (int i = 0; i < path.size() - 1; i++) {
  52.             cout << path[i] << " -> ";
  53.         }
  54.         cout << path.back() << '\n';
  55.     }
  56. }
  57.  
  58. int main()
  59. {
  60.     int t = 1;
  61.     // cin >> t;
  62.     for (int i = 1; i <= t; i++)
  63.     {
  64.         solve();
  65.     }
  66.     return 0;
  67. }
  68.  
Advertisement
Add Comment
Please, Sign In to add comment