Advertisement
RaFiN_

cf-95C

Dec 30th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.76 KB | None | 0 0
  1.  
  2.  
  3.  
  4. /* We can do all pair shortest path by O(n*n*logn) instead of O(n*n*n) by running dijkstra n times . */
  5.  
  6. int n,m,sor,des;vector<pii> v[MAX],v2[MAX];ll t[MAX],w[MAX],c[MAX];ll dis[MAX];
  7.  
  8. void dij(int s)
  9. {
  10.     for(int i = 1;i<=n;i++)dis[i] = 1e15;
  11.     dis[s] = 0;
  12.  
  13.     priority_queue<pii ,vector<pii> ,greater <pii> >pq;
  14.  
  15.     pq.push(pii(dis[s],s));
  16.  
  17.     while(!pq.empty())
  18.     {
  19.         pii x = pq.top();
  20.         pq.pop();
  21.         for(auto it : v[x.ss])
  22.         {
  23.             if(dis[it.ss]>dis[x.ss]+it.ff)
  24.             {
  25.                 dis[it.ss] = dis[x.ss] + it.ff;
  26.                 pq.push(pii(dis[it.ss],it.ss));
  27.             }
  28.         }
  29.     }
  30.  
  31.     for(int i = 1;i<=n;i++)
  32.     {
  33.         if(i==s)continue;
  34.         if(dis[i]<=t[s])
  35.         {
  36.             v2[s].pb(pii(w[s],i));
  37.  
  38.         }
  39.     }
  40. }
  41.  
  42. ll dij2(int s)
  43. {
  44.     for(int i = 1;i<=n;i++)dis[i] = 1e15;
  45.     dis[s] = 0;
  46.  
  47.     priority_queue<pii ,vector<pii> ,greater <pii> >pq;
  48.     pq.push(pii(dis[s],s));
  49.  
  50.     while(!pq.empty())
  51.     {
  52.         pii x = pq.top();
  53.         pq.pop();
  54.         for(auto it : v2[x.ss])
  55.         {
  56.             if(dis[it.ss]>dis[x.ss]+it.ff)
  57.             {
  58.                 dis[it.ss] = dis[x.ss] + it.ff;
  59.                 pq.push(pii(dis[it.ss],it.ss));
  60.             }
  61.         }
  62.     }
  63.     if(dis[des]<1e15)return dis[des];
  64.     else return -1 ;
  65. }
  66.  
  67.  
  68. int main()
  69. {
  70.     booster()
  71.     ///read("input.txt");
  72.     cin>>n>>m>>sor>>des;
  73.  
  74.     for(int i = 0;i<m;i++)
  75.     {
  76.         int a,b,c;
  77.         cin>>a>>b>>c;
  78.         v[a].pb(pii(c,b));
  79.         v[b].pb(pii(c,a));
  80.     }
  81.  
  82.     for(int i = 0;i<n;i++)
  83.     {
  84.         cin>>t[i+1]>>w[i+1];
  85.     }
  86.  
  87.  
  88.     for(int i = 1;i<=n;i++)
  89.     {
  90.         dij(i);
  91.     }
  92.  
  93.     cout<<dij2(sor);
  94.  
  95.  
  96.  
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement