Advertisement
_no0B

Untitled

Nov 1st, 2021
949
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.85 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define MAX ((int)1e9 + 5)
  3. #define N ((int)5e4 + 5)
  4. using namespace std;
  5.  
  6.  
  7.  
  8.  
  9. vector < int > dijkstra(vector < vector < pair < int , int > > >& edg, int src , int n)
  10. {
  11.     vector < int > dis(n+1,MAX);
  12.  
  13.     dis[src] = 0;
  14.     priority_queue < pair < int , int > > pqq;
  15.     pqq.push({0,src}); /// (-distance,node)
  16.     while(!pqq.empty()){
  17.         pair < int , int > p = pqq.top();
  18.         pqq.pop();
  19.         int cur = p.second;
  20.         if(-p.first > dis[cur]) continue;
  21.         for(auto nxt:edg[cur]){
  22.             int node = nxt.first , wgh = nxt.second;
  23.             int val = dis[cur] + wgh;
  24.             if(val < dis[node]){
  25.                 dis[node] = val;
  26.                 pqq.push({-val , node});
  27.             }
  28.         }
  29.     } /// O(m * log(m))
  30.     return dis;
  31. }
  32.  
  33. void AddEdge(vector < pair < int , int > >& edg, int too , int cost)
  34. {
  35.     edg.push_back({too,cost});
  36. }
  37.  
  38. int from[N] , too[N] , cost[N];
  39.  
  40. int main()
  41. {
  42.     /// problem H
  43.     int t, caseNo = 1;
  44.     cin>>t;
  45.     while(t--){
  46.         int n , m , src, des , money;
  47.         cin>>n>>m>>src>>des>>money;
  48.         vector < vector < pair < int , int > > > forEdg(n+1 , vector < pair < int , int > >() ) , revEdg(n+1, vector < pair < int , int > >() );
  49.  
  50.         for(int i = 1 ; i <= m ; i++){
  51.             cin>>from[i]>>too[i]>>cost[i];
  52.             AddEdge(forEdg[from[i]], too[i], cost[i]);
  53.             AddEdge(revEdg[too[i]] , from[i] , cost[i]);
  54.         }
  55.  
  56.         vector < int > disFromSrc = dijkstra(forEdg, src , n) , disFromDes = dijkstra(revEdg , des , n);
  57.         int ans = -1;
  58.         for(int i = 1 ; i <= m ; i++){
  59.             int u = from[i] , v = too[i];
  60.             if(disFromSrc[u] + cost[i] + disFromDes[v] <= money) ans = max(ans , cost[i]);
  61.         }
  62.         cout<<"Case "<<caseNo++<<": "<<ans<<endl;
  63.     }
  64.     return 0;
  65. }
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement