Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // using brian bi's idea of a shortest path using a road
- // follows the form of FD(u) + (u,v) + RD(v)
- #include<bits/stdc++.h>
- #define needforspeed std::ios::sync_with_stdio(false);
- #define pb push_back
- #define mp make_pair
- #define all(x) (x).begin(),(x).end()
- #define len(x) (int)(x).size()
- #define xx first
- #define yy second
- #define inf 2*(int)1e9
- #define MAXN (int)1e5
- #define db 1
- using namespace std;
- int N,M,Q,A,B;
- vector< pair<int,int> > fadj[MAXN],radj[MAXN];// node,length
- vector< pair< pair<int,int>,pair<int,int> > >roads;// x,y,l,c
- void dijkstra(int src,vector<int>&dist,vector< pair<int,int> >adj[MAXN]){
- dist[src] = 0;
- priority_queue< pair<int,int> >pq;
- pq.push(mp(0,src));
- while(!pq.empty()){
- pair<int,int>P = pq.top();
- int n = P.second,d = -P.first;
- pq.pop();
- for(int i = 0;i < len(adj[n]);i++){
- int nt = adj[n][i].first;
- int ct = adj[n][i].second;
- if(dist[nt] > dist[n]+ct){
- dist[nt] = dist[n]+ct;
- pq.push(mp(-dist[nt],nt));
- }
- }
- }
- }
- int main(){
- //freopen("input.txt","r",stdin);
- needforspeed;
- cin >> N >> M >> A >> B;A--,B--;
- for(int i = 0,x,y,l,c;i < M;i++){
- cin >> x >> y >> l >> c;x--,y--;
- fadj[x].pb(mp(y,l));
- radj[y].pb(mp(x,l));
- roads.pb(mp(mp(x,y),mp(l,c)));
- }
- vector<int>fdist(N,inf),rdist(N,inf);
- vector< pair<int,int> >paths;
- dijkstra(A,fdist,fadj);
- dijkstra(B,rdist,radj);
- for(int i = 0;i < M;i++){
- int dist = 0;
- int x = roads[i].first.first, y = roads[i].first.second;
- int l = roads[i].second.first, c = roads[i].second.second;
- if(fdist[x] == inf || rdist[y] == inf)
- dist = inf;// this path is impossible
- else
- dist = fdist[x] + l + rdist[y];
- paths.pb(mp(dist,c));
- }
- sort(all(paths));
- vector<int>distances(M),P(M+1);
- for(int i = 1;i <= M;i++){
- P[i] = paths[i-1].second + P[i-1];
- distances[i-1] = paths[i-1].first;
- }
- cin >> Q;
- for(int i = 0,D = 0;i < Q;i++){
- cin >> D;
- int idx = upper_bound(all(distances),D)-distances.begin();
- cout << P[idx] << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement