YEZAELP

CUBE-151: Marathon

Jun 13th, 2020
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.28 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int INF=1e9;
  4. using pii=pair<int,int>;
  5. struct node{
  6.     int v,d,t;
  7. };
  8. int f(vector <node> g[],int D,int n,int T){
  9.     vector <bool> visited(n+1,false);
  10.     vector <int> dis(n+1,INF);
  11.     priority_queue <pii,vector<pii>,greater<pii>> pq;
  12.     dis[1]=0;
  13.     pq.push({dis[1],1});
  14.     while(pq.size()>0){
  15.         int u,dist;
  16.         u=pq.top().second;
  17.         dist=pq.top().first;
  18.         pq.pop();
  19.         if(visited[u] or dist>T)
  20.             continue;
  21.         visited[u]=true;
  22.         if(u==n)
  23.             return dist;
  24.         for(auto vdt:g[u]){
  25.             int v,d,t;
  26.             v=vdt.v;
  27.             d=vdt.d;
  28.             t=vdt.t;
  29.             if(!visited[v] and d<=D and dis[u]+t<dis[v]){
  30.                 dis[v]=dis[u]+t;
  31.                 pq.push({dis[v],v});
  32.             }
  33.         }
  34.     }
  35.     return INF;
  36. }
  37. int main(){
  38.  
  39.     int n,m,k,T;
  40.     scanf("%d%d%d%d",&n,&m,&k,&T);
  41.     vector <node> g[n+1];
  42.  
  43.     int l=INF,r=-INF,mid;
  44.     for(int i=1;i<=m;i++){
  45.         int u,v,d,t;
  46.         scanf("%d%d%d%d",&u,&v,&d,&t);
  47.         g[u].push_back({ v,d,t });
  48.         g[v].push_back({ u,d,t });
  49.         l=min(l,d);
  50.         r=max(r,d);
  51.     }
  52.  
  53.     int mn=INF;
  54.     while(l<=r){
  55.         mid=(l+r)/2;
  56.         if( f(g,mid,n,T)<=T ){
  57.             r=mid-1;
  58.             mn=min(mn,mid);
  59.         }
  60.         else l=mid+1;
  61.     }
  62.     int ans=INF;
  63.     for(int i=1;i<=k;i++){
  64.         int p,s;
  65.         scanf("%d%d",&p,&s);
  66.         if(s>=mn) ans=min(ans,p);
  67.     }
  68.  
  69.     if(ans==INF) printf("-1");
  70.     else printf("%d",ans);
  71.  
  72.     return 0;
  73. }
Add Comment
Please, Sign In to add comment