orazma

dijkstra.cpp

May 21st, 2026
51
0
Never
5
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.28 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define f first
  4. #define s second
  5. #define ll long long
  6. #define vec vector
  7. #define pii pair<int,int>
  8. #define YES cout << "YES" << "\n"
  9. #define NO cout << "NO" <<  "\n"
  10.  
  11. using namespace std;
  12. const int MAXN = 2e5 + 5;
  13. const ll INF = 1e18 + 7;
  14. const ll MOD1 = 1e9 + 7;
  15. const ll MOD2 = 1e9 + 9;
  16. int a[MAXN];
  17.  
  18. vector <pair <int, int> > g[MAXN];
  19. int main(){
  20.     ios::sync_with_stdio(0);
  21.     cin.tie(0);
  22.     cout.tie(0);
  23.  
  24.     int n, m;
  25.     cin >> n >> m;
  26.  
  27.     for (int i = 1; i <= m; i++){
  28.         int x, y, cost;
  29.         cin >> x >> y >> cost;
  30.         g[x].pb({y, cost});
  31.         g[y].pb({x, cost});
  32.     }
  33.  
  34.     int s, f;
  35.     cin >> s >> f;
  36.  
  37.     for (int i = 1; i <= n; i++){
  38.         dist[i] = INF;
  39.     }
  40.     dist[s] = 0;
  41.     pr[s] = -1;
  42.     //O(n * n + m)
  43.     for (int i = 1; i <= n; i++){
  44.         minn = INF;
  45.         v = -1;
  46.         for (int j = 1; j <= n; j++){
  47.             if (dist[j] < minn && !was[j]){
  48.                 minn = dist[j];
  49.                 v = j;
  50.             }
  51.         }
  52.         if (minn == INF){
  53.             break;
  54.         }
  55.         was[v] = 1;
  56.         for (int j = 0; j < g[v].size(); j++){
  57.             int to = g[v][j].f;
  58.             int len = g[v][j].s;
  59.             if (dist[to] > dist[v] + len){
  60.                 dist[to] = dist[v] + len;
  61.                 pr[to] = v;
  62.             }
  63.         }
  64.     }
  65.     if (dist[f] == INF){
  66.         cout << -1;
  67.     }
  68.     else{
  69.         cout << dist[f] << '\n';
  70.  
  71.         int x = f;
  72.         vector <int> ans;
  73.         while (x != -1){
  74.             ans.pb(x);
  75.             x = pr[x];
  76.         }
  77.         reverse(ans.begin(), ans.end());
  78.         for (int v : ans){
  79.             cout << v << ' ';
  80.         }
  81.     }
  82.  
  83.  
  84.     // set O(mlogn)
  85.      //      dist[v]  v
  86.     set <pair <int, int> > st;
  87.  
  88.     for (int i = 1; i <= n; i++){
  89.         dist[i] = INF;
  90.     }
  91.     dist[s] = 0;
  92.     st.insert({dist[s], s});
  93.  
  94.     while (!st.empty()){
  95.         pair <int, int> z = *st.begin();
  96.         int v = z.s;
  97.  
  98.         for (int i = 0; i < g[v].size(); i++){
  99.             int to = g[v][i].f;
  100.             int len = g[v][i].s;
  101.  
  102.             if (dist[to] > dist[v] + len){
  103.                 st.erase({dist[to], to});
  104.                 dist[to] = dist[v] + len;
  105.                 st.insert({dist[to], to});
  106.             }
  107.         }
  108.     }
  109.  
  110.  
  111.     return 0;
  112. }
  113.  
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
Add Comment
Please, Sign In to add comment