Advertisement
SuitNdtie

BudgetTraveler

May 2nd, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<queue>
  4. using namespace std;
  5. typedef long long int ll;
  6. struct edge{
  7.     int v;
  8.     ll w;
  9. };
  10.  
  11. struct elem{
  12.     ll dis;
  13.     int u;
  14.     bool operator < (const elem& rhs)const
  15.     {
  16.         return dis > rhs.dis;
  17.     }
  18. };
  19. int main()
  20. {
  21.     int n,m;
  22.     scanf("%d %d",&n,&m);
  23.     int sour,dest;
  24.     ll budget;
  25.     scanf("%d %d %lld",&sour,&dest,&budget);
  26.     vector<edge> adj[n];
  27.     for(int i = 0 ; i < m ; i ++){
  28.         int u,v;
  29.         ll w;
  30.         scanf("%d %d %lld",&u,&v,&w);
  31.         adj[u].push_back({v,w});
  32.         adj[v].push_back({u,w});
  33.     }
  34.     ll distFs[n];
  35.     bool visitedFs[n];
  36.     ll distFd[n];
  37.     bool visitedFd[n];
  38.     for(int i = 0 ; i < n ; i ++){
  39.         distFs[i] = 1e18;
  40.         distFd[i] = 1e18;
  41.         visitedFs[i] = false;
  42.         visitedFd[i] = false;
  43.     }
  44.     priority_queue<elem> pq;
  45.     distFs[sour] = 0;
  46.     pq.push({distFs[sour],sour});
  47.     while(!pq.empty()){
  48.         int u = pq.top().u;
  49.         pq.pop();
  50.         if(visitedFs[u])continue;
  51.         visitedFs[u] = true;
  52.         for(int i = 0 ; i < adj[u].size() ; i ++){
  53.             int v = adj[u][i].v;
  54.             ll w = adj[u][i].w;
  55.             if(distFs[u] + w < distFs[v] && !visitedFs[v]){
  56.                 distFs[v] = distFs[u] + w;
  57.                 pq.push({distFs[v],v});
  58.             }
  59.         }
  60.     }
  61.     if(distFs[dest] <= budget){
  62.         printf("%d %lld 0",dest,distFs[dest]);
  63.         return 0;
  64.     }
  65.        
  66.     distFd[dest] = 0;
  67.     pq.push({distFs[dest],dest});
  68.     while(!pq.empty())
  69.     {
  70.         int u = pq.top().u;
  71.         pq.pop();
  72.         if(visitedFd[u])continue;
  73.         visitedFd[u] = true;
  74.         for(int i = 0 ; i < adj[u].size() ; i ++){
  75.             int v = adj[u][i].v;
  76.             ll w = adj[u][i].w;
  77.             if(distFd[u] + w < distFd[v] && !visitedFd[v]){
  78.                 distFd[v] = distFd[u] + w;
  79.                 pq.push({distFd[v],v});
  80.             }
  81.         }  
  82.     }  
  83.    
  84.     int mina = 1e18;
  85.     int minb = 0;
  86.     int mini = 0;
  87.     for(int i = 0 ; i < n ; i ++){
  88.         if(distFs[i] <= budget && distFd[i] < mina){
  89.             mina = distFd[i];
  90.             minb = distFs[i];
  91.             mini = i;
  92.         }
  93.     }
  94.     printf("%d %lld %lld",mini,minb,mina);
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement