Advertisement
AlexG2230954

Untitled

Feb 22nd, 2022
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. #define INF 1e18
  6.  
  7. using namespace std;
  8.  
  9. struct edge { int next; ll weight; };
  10.  
  11. using ll = long long;
  12. using item = pair<ll, int>;
  13. using graph = vector<vector<edge>>;
  14.  
  15.  
  16. vector<ll> min_ways(graph & g, int start) {
  17.     priority_queue<item> q; // мин. точка из рассматриваемых
  18.     vector<bool> visited(g.size(), false); // посещенные точки
  19.     vector<ll> mins(g.size(), INF); // мин. путь к точкам
  20.    
  21.     // инициализация стартового состояния
  22.     mins[start] = 0;
  23.     q.push({0, start});
  24.  
  25.     while(!q.empty()) {
  26.         int ind = q.top().second; // рассматриваемая точка
  27.         ll curr_min = -q.top().first; // мин. путь к этой точке
  28.         q.pop();
  29.  
  30.         if(visited[ind]) continue; // если точка уже посещена - пропускаем
  31.         visited[ind] = true; // помечаем посещенной
  32.  
  33.         for(edge v : g[ind]) {
  34.             ll new_weight = curr_min + v.weight;
  35.            
  36.             if(new_weight < mins[v.next]) {
  37.                 mins[v.next] = new_weight;
  38.                 q.push({-new_weight, v.next});
  39.             }
  40.         }
  41.     }
  42.  
  43.     return mins;
  44. }
  45.  
  46. int main() {
  47.     int n, m, s, u, v, w;
  48.  
  49.     cin >> n >> m >> s;
  50.     s--;
  51.  
  52.     graph g(n);
  53.     while(m--) {
  54.         cin >> u >> v >> w;
  55.         u--; v--;
  56.  
  57.         g[u].push_back({.next = v, .weight = w});
  58.         g[v].push_back({.next = u, .weight = w});
  59.     }
  60.  
  61.     for(int64_t el : min_ways(g, s))
  62.         cout << (el == INF ? -1 : el) << " ";
  63. }
  64.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement