Naxocist

Budget Travelling

Apr 30th, 2022
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define INF 2e9
  5.  
  6. using ll = long long;
  7. using vi = vector<int>;
  8. using pi = pair<int, int>;
  9.  
  10. const int N = 1e4 + 3;
  11. vector<pi> adj[N];
  12. int dist[N], distr[N];
  13.  
  14. int main() {
  15.  
  16.     ios::sync_with_stdio(false); cin.tie(nullptr);
  17.  
  18.     int n, m; cin >> n >> m;
  19.  
  20.     for(int i=0; i<n; ++i) dist[i] = INF, distr[i] = INF;
  21.  
  22.     int s, e, l; cin >> s >> e >> l;
  23.  
  24.     for(int i=0; i<m; ++i){
  25.         int u, v, w; cin >> u >> v >> w;
  26.         adj[u].push_back({w, v});
  27.         adj[v].push_back({w, u});
  28.     }
  29.  
  30.     priority_queue<pi, vector<pi>, greater<pi>> pq;
  31.     pq.push({0, s});
  32.     dist[s] = 0;
  33.  
  34.     while(pq.size()){
  35.         pi t = pq.top(); pq.pop();
  36.         int w = t.first, u = t.second;
  37.  
  38.         if(w > dist[u]) continue;
  39.  
  40.         for(pi x : adj[u]){
  41.             int v = x.second, vw = x.first;
  42.             if(dist[u] + vw < dist[v]){
  43.                 dist[v] = dist[u] + vw;
  44.                 pq.push({dist[v], v});
  45.             }
  46.         }
  47.     }
  48.  
  49.     if(dist[e] <= l){
  50.         cout << e << ' ' << dist[e] << ' ' << 0;
  51.         return 0;
  52.     }
  53.  
  54.     pq.push({0, e});
  55.     distr[e] = 0;
  56.  
  57.     while(pq.size()){
  58.         pi t = pq.top(); pq.pop();
  59.         int w = t.first, u = t.second;
  60.  
  61.         if(w > distr[u]) continue;
  62.  
  63.         for(pi x : adj[u]){
  64.             int v = x.second, vw = x.first;
  65.             if(distr[u] + vw < distr[v]){
  66.                 distr[v] = distr[u] + vw;
  67.                 pq.push({distr[v], v});
  68.             }
  69.         }
  70.     }
  71.  
  72.     int mn = 1e9, z = e;
  73.     for(int i=0; i<n; ++i) {
  74.         if(i == e || dist[i] > l) continue;
  75.         if(distr[i] < mn) mn = distr[i], z = i;
  76.     }
  77.     cout << z << ' ' << dist[z] << ' ' << mn;
  78. }
  79.  
Advertisement
Add Comment
Please, Sign In to add comment