Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define MAX ((int)1e9 + 5)
- #define N ((int)5e4 + 5)
- using namespace std;
- vector < int > dijkstra(vector < vector < pair < int , int > > >& edg, int src , int n)
- {
- vector < int > dis(n+1,MAX);
- dis[src] = 0;
- priority_queue < pair < int , int > > pqq;
- pqq.push({0,src}); /// (-distance,node)
- while(!pqq.empty()){
- pair < int , int > p = pqq.top();
- pqq.pop();
- int cur = p.second;
- if(-p.first > dis[cur]) continue;
- for(auto nxt:edg[cur]){
- int node = nxt.first , wgh = nxt.second;
- int val = dis[cur] + wgh;
- if(val < dis[node]){
- dis[node] = val;
- pqq.push({-val , node});
- }
- }
- } /// O(m * log(m))
- return dis;
- }
- void AddEdge(vector < pair < int , int > >& edg, int too , int cost)
- {
- edg.push_back({too,cost});
- }
- int from[N] , too[N] , cost[N];
- int main()
- {
- /// problem H
- int t, caseNo = 1;
- cin>>t;
- while(t--){
- int n , m , src, des , money;
- cin>>n>>m>>src>>des>>money;
- vector < vector < pair < int , int > > > forEdg(n+1 , vector < pair < int , int > >() ) , revEdg(n+1, vector < pair < int , int > >() );
- for(int i = 1 ; i <= m ; i++){
- cin>>from[i]>>too[i]>>cost[i];
- AddEdge(forEdg[from[i]], too[i], cost[i]);
- AddEdge(revEdg[too[i]] , from[i] , cost[i]);
- }
- vector < int > disFromSrc = dijkstra(forEdg, src , n) , disFromDes = dijkstra(revEdg , des , n);
- int ans = -1;
- for(int i = 1 ; i <= m ; i++){
- int u = from[i] , v = too[i];
- if(disFromSrc[u] + cost[i] + disFromDes[v] <= money) ans = max(ans , cost[i]);
- }
- cout<<"Case "<<caseNo++<<": "<<ans<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement