Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1. // using brian bi's idea of a shortest path using a road
  2. // follows the form of FD(u) + (u,v) + RD(v)
  3. #include<bits/stdc++.h>
  4. #define needforspeed std::ios::sync_with_stdio(false);
  5. #define pb push_back
  6. #define mp make_pair
  7. #define all(x) (x).begin(),(x).end()
  8. #define len(x) (int)(x).size()
  9. #define xx first
  10. #define yy second
  11. #define inf 2*(int)1e9
  12. #define MAXN (int)1e5
  13. #define db 1
  14. using namespace std;
  15.  
  16. int N,M,Q,A,B;
  17. vector< pair<int,int> > fadj[MAXN],radj[MAXN];// node,length
  18. vector< pair< pair<int,int>,pair<int,int> > >roads;// x,y,l,c
  19.  
  20. void dijkstra(int src,vector<int>&dist,vector< pair<int,int> >adj[MAXN]){
  21.     dist[src] = 0;
  22.     priority_queue< pair<int,int> >pq;
  23.     pq.push(mp(0,src));
  24.     while(!pq.empty()){
  25.           pair<int,int>P = pq.top();
  26.           int n = P.second,d = -P.first;
  27.           pq.pop();
  28.           for(int i = 0;i < len(adj[n]);i++){
  29.               int nt = adj[n][i].first;
  30.               int ct = adj[n][i].second;
  31.               if(dist[nt] > dist[n]+ct){
  32.                  dist[nt] = dist[n]+ct;
  33.                  pq.push(mp(-dist[nt],nt));
  34.               }
  35.           }
  36.     }
  37. }
  38.  
  39. int main(){
  40.     //freopen("input.txt","r",stdin);
  41.     needforspeed;
  42.     cin >> N >> M >> A >> B;A--,B--;
  43.     for(int i = 0,x,y,l,c;i < M;i++){
  44.         cin >> x >> y >> l >> c;x--,y--;
  45.         fadj[x].pb(mp(y,l));
  46.         radj[y].pb(mp(x,l));
  47.         roads.pb(mp(mp(x,y),mp(l,c)));
  48.     }
  49.     vector<int>fdist(N,inf),rdist(N,inf);
  50.     vector< pair<int,int> >paths;
  51.     dijkstra(A,fdist,fadj);
  52.     dijkstra(B,rdist,radj);
  53.     for(int i = 0;i < M;i++){
  54.         int dist = 0;
  55.         int x = roads[i].first.first,  y = roads[i].first.second;
  56.         int l = roads[i].second.first, c = roads[i].second.second;
  57.         if(fdist[x] == inf || rdist[y] == inf)
  58.            dist = inf;// this path is impossible
  59.         else
  60.            dist = fdist[x] + l + rdist[y];
  61.         paths.pb(mp(dist,c));
  62.     }
  63.     sort(all(paths));
  64.     vector<int>distances(M),P(M+1);
  65.     for(int i = 1;i <= M;i++){
  66.         P[i] = paths[i-1].second + P[i-1];
  67.         distances[i-1] = paths[i-1].first;
  68.     }
  69.     cin >> Q;
  70.     for(int i = 0,D = 0;i < Q;i++){
  71.         cin >> D;
  72.         int idx = upper_bound(all(distances),D)-distances.begin();
  73.         cout << P[idx] << endl;
  74.     }
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement