Advertisement
SuitNdtie

Marathon

Apr 18th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<algorithm>
  4. #include<queue>
  5. using namespace std;
  6. typedef long long int ll;
  7.  
  8. struct edge{
  9.     int v;
  10.     int d;
  11.     ll w;
  12. };
  13.  
  14. int main()
  15. {
  16.     int n,m,k;
  17.     ll t;
  18.     scanf("%d %d %d %lld",&n,&m,&k,&t);
  19.     vector<edge> adj[n+1];
  20.     for(int i=0;i<m;i++){
  21.         int u,v,d;
  22.         ll w;
  23.         scanf("%d %d %d %lld",&u,&v,&d,&w);
  24.         adj[u].push_back({v,d,w});
  25.         adj[v].push_back({u,d,w});
  26.     }
  27.     vector<pair<ll,int> > shoes;
  28.     for(int i=0;i<k;i++){
  29.         ll str;
  30.         int price;
  31.         scanf("%d %lld",&price,&str);
  32.         shoes.push_back({str,price});
  33.     }
  34.     sort(shoes.begin(),shoes.end());
  35. /*  for(int i=0;i<shoes.size();i++){
  36.         printf("(%lld %d)\n",shoes[i].first,shoes[i].second);
  37.     }*/
  38.     int minstr = 2e9;
  39.     int l = 0 , r = shoes.size() - 1;
  40.     while(l <= r){
  41.         int m = (l+r)/2;
  42.         int strength = shoes[m].first;
  43.        
  44.         //dijkstra
  45.         ll dist[n+1];for(int i=0;i<=n;i++)dist[i] = 2e18;
  46.         bool visited[n+1];for(int i=0;i<=n;i++)visited[i] = false;
  47.         priority_queue<pair<int,int> ,vector<pair<int,int> >,greater<pair<int,int > > > pq;
  48.         pq.push({0,1});
  49.         dist[1] = 0;
  50.         while(!pq.empty()){
  51.             int u = pq.top().second;
  52.             pq.pop();
  53.             if(visited[u])continue;
  54.             visited[u] = true;
  55.             for(int i=0;i<adj[u].size();i++){
  56.                 int v = adj[u][i].v;
  57.                 int d = adj[u][i].d;
  58.                 ll w = adj[u][i].w;
  59.                 if(!visited[v] && dist[u] + w < dist[v] && strength >= d){
  60.                     dist[v] = dist[u] + w;
  61.                     pq.push({dist[v],v});
  62.                 }
  63.             }
  64.         }
  65.        
  66.         if(dist[n] <= t){
  67.             if(strength < minstr){
  68.                 minstr = strength;
  69.             }
  70.             r = m - 1;
  71.         }
  72.         else{
  73.             l = m + 1;
  74.         }
  75.     }
  76.     int index = 0;
  77.     int ans = 2e9;
  78.     while(shoes[index].first < minstr && index < k)index++;
  79.     while(index < k){
  80.         if(shoes[index].second < ans)ans = shoes[index].second;
  81.         index++;
  82.     }
  83.     printf("%d",(ans == 2e9 ? -1 : ans));
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement