SuitNdtie

Cable Car

Apr 17th, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.19 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. int main()
  7. {
  8.     int n,m;
  9.     scanf("%d %d",&n,&m);
  10.     vector<pair<ll,int> > adj[n+1];
  11.     for(int i=0;i<m;i++){
  12.         int u,v;
  13.         ll w;
  14.         scanf("%d %d %lld",&u,&v,&w);
  15.         adj[u].push_back({w,v});
  16.         adj[v].push_back({w,u});
  17.     }
  18.     ll dist[n+1];for(int i=0;i<=n;i++)dist[i] = -2e18;
  19.     int sour,dest;
  20.     ll people;
  21.     scanf("%d %d %lld",&sour,&dest,&people);
  22.    
  23.     dist[sour] = 0;
  24.     priority_queue<pair<pair<ll,int> ,int > >pq;
  25.     pq.push({{0,sour},0});
  26.     bool visited[n+1];for(int i=0;i<=n;i++)visited[i] = false;
  27.    
  28.     int parent[n + 1];
  29.     while(!pq.empty()){
  30.         int u = pq.top().first.second;
  31.         int prev = pq.top().second;
  32.         pq.pop();
  33.         if(visited[u])continue;
  34.         visited[u] = true;
  35.     //  printf("%d -> %d\n",prev,u);
  36.         parent[u] = prev;
  37.         for(int i=0;i<adj[u].size();i++){
  38.             ll w = adj[u][i].first;
  39.             int v = adj[u][i].second;
  40.             if(!visited[v] && w > dist[v]){
  41.                 dist[v] = w;
  42.                 pq.push({{dist[v],v},u});
  43.             }
  44.         }
  45.     }
  46.     int pr = dest;
  47.     ll minw = 2e9;
  48.     do{
  49.         if(dist[pr] < minw)minw = dist[pr];
  50.         pr = parent[pr];
  51.     }while(pr != sour);
  52.    
  53.     printf("%lld",(people + minw - 2)/(minw - 1));
  54.     return 0;
  55. }
Add Comment
Please, Sign In to add comment