Advertisement
mickypinata

SMMR-T167: Grandiosity

Jun 19th, 2021
1,133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long lli;
  5. typedef pair<lli, int> pli;
  6. typedef pair<int, int> pii;
  7. typedef tuple<int, int, int> tiii;
  8.  
  9. const int N = 1e4;
  10.  
  11. vector<pii> adj[N + 10], rev[N + 10];
  12. vector<lli> dist[2];
  13. vector<tiii> edges;
  14. int nVertex;
  15.  
  16. void Dijkstra(int st, int i){
  17.     priority_queue<pli, vector<pli>, greater<pli>> pq;
  18.     vector<bool> visited(nVertex + 1, false);
  19.     dist[i].assign(nVertex + 1, 1e18);
  20.     dist[i][st] = 0;
  21.     pq.emplace(0, st);
  22.     while(!pq.empty()){
  23.         int u = pq.top().second;
  24.         pq.pop();
  25.         if(visited[u]){
  26.             continue;
  27.         }
  28.         visited[u] = true;
  29.         for(pii p : (i == 0)? adj[u] : rev[u]){
  30.             int v = p.first;
  31.             int w = p.second;
  32.             if(!visited[v] && dist[i][u] + w < dist[i][v]){
  33.                 dist[i][v] = dist[i][u] + w;
  34.                 pq.emplace(dist[i][v], v);
  35.             }
  36.         }
  37.     }
  38. }
  39.  
  40. int main(){
  41.  
  42.     int nEdge, st, ed;
  43.     lli lim;
  44.     scanf("%d%d%d%d%lld", &nVertex, &nEdge, &st, &ed, &lim);
  45.  
  46.     for(int i = 1; i <= nEdge; ++i){
  47.         int u, v, w;
  48.         scanf("%d%d%d", &u, &v, &w);
  49.         adj[u].emplace_back(v, w);
  50.         rev[v].emplace_back(u, w);
  51.         edges.emplace_back(w, u, v);
  52.     }
  53.  
  54.     Dijkstra(st, 0);
  55.     Dijkstra(ed, 1);
  56.  
  57.     int mx = -1;
  58.     for(tiii e : edges){
  59.         int w = get<0>(e);
  60.         int u = get<1>(e);
  61.         int v = get<2>(e);
  62.         lli sum = dist[0][u] + w + dist[1][v];
  63.         if(sum <= lim){
  64.             mx = max(mx, w);
  65.         }
  66.     }
  67.  
  68.     cout << mx;
  69.  
  70.     return 0;
  71. }
  72.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement