/*
* Key Observation: 只能顺着S->T走一段免费的或者逆着S->T走一段免费的; 不可能顺着+逆着,否则这一定不是S->T的最短路的一部分
*/
#include <bits/stdc++.h>
#define int long long
#define INF 1e16
#define pi pair<int,int>
#define fi first
#define se second
#define pb push_back
using namespace std;
const int maxN = 2e5+5;
struct cmp{
bool operator() (pi a, pi b){
return a.fi > b.fi;
}
};
int N,M,S,T,U,V,res;
vector<pi> adj[maxN]; //original graph
vector<pi> adj2[maxN<<2]; //4-layered graph
int distS[maxN],distT[maxN];
void dijk(int dist[], int src){
for(int i = 1; i <= N; ++i)dist[i] = INF;
bool vis[maxN];
memset(vis,false,sizeof(vis));
priority_queue<pi,vector<pi>,cmp> Q;
Q.push(pi(0,src));
dist[src] = 0;
while(!Q.empty()){
pi p = Q.top(); Q.pop();
int d = p.fi; int loc = p.se;
if(vis[loc])continue;
vis[loc] = true;
for(auto x: adj[loc]){
if(dist[loc] + x.se < dist[x.fi]){
dist[x.fi] = dist[loc] + x.se;
if(!vis[x.fi]){
Q.push(pi(dist[x.fi],x.fi));
}
}
}
}
}
//for dijkstra on the layered graph
int dist[maxN<<2];
bool vis[maxN<<2];
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
//freopen("../test.in","r",stdin);
cin >> N >> M >> S >> T >> U >> V;
for(int i = 1; i <= M; ++i) {
int a, b, c;
cin >> a >> b >> c;
adj[a].pb(pi(b,c));
adj[b].pb(pi(a,c));
//layer 1 to layer 1
adj2[a].pb(pi(b,c));
adj2[b].pb(pi(a,c));
//layer 1 to layer 2, enter into forward commuter pass (S->T)
adj2[a].pb(pi(N+a,0));
adj2[b].pb(pi(N+b,0));
//layer 1 to layer 3, enter into backward commuter pass (T->S)
adj2[a].pb(pi(2*N+a,0));
adj2[b].pb(pi(2*N+b,0));
//layer 1 to layer 4, for skipping commuter pass
adj2[a].pb(pi(3*N+a,0));
adj2[b].pb(pi(3*N+b,0));
//layer 2 to layer 4, exiting commuter pass
adj2[N+i].pb(pi(3*N+i,0));
//layer 3 to layer 4, exiting commuter pass
adj2[2*N+i].pb(pi(3*N+i,0));
//layer 4 to layer 4
adj2[3*N+a].pb(pi(3*N+b,c));
adj2[3*N+b].pb(pi(3*N+a,c));
}
dijk(distS,S);
dijk(distT,T);
for(int i = 1; i <= N; ++i){
for(auto x: adj[i]){
if(distS[i] + x.se + distT[x.fi] == distS[T]){
//Ensures edge x is a part of a shortest path from S to T
//this edge must be from S->T and not T->S
//layer 2 to layer 2
adj2[N+i].pb(pi(N+x.fi,0));
//layer 3 to layer 3
adj2[2*N+x.fi].pb(pi(2*N+i,0));
}
}
}
//dijk for adj2, src = U
for(int i = 1; i <= 4*N; ++i)dist[i] = INF;
memset(vis,false,sizeof(vis));
priority_queue<pi,vector<pi>,cmp> Q;
Q.push(pi(0,U));
dist[U] = 0;
while(!Q.empty()){
pi p = Q.top(); Q.pop();
int loc = p.se;
if(vis[loc])continue;
vis[loc] = true;
for(auto x: adj2[loc]){
if(dist[loc] + x.se < dist[x.fi]){
dist[x.fi] = dist[loc] + x.se;
if(!vis[x.fi]){
Q.push(pi(dist[x.fi],x.fi));
}
}
}
}
cout << dist[3*N+V] << '\n';
}
Compilation message
commuter_pass.cpp: In function 'void dijk(long long int*, long long int)':
commuter_pass.cpp:31:13: warning: unused variable 'd' [-Wunused-variable]
31 | int d = p.fi; int loc = p.se;
| ^
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
937 ms |
101496 KB |
Output is correct |
2 |
Correct |
891 ms |
99732 KB |
Output is correct |
3 |
Correct |
1010 ms |
102260 KB |
Output is correct |
4 |
Correct |
949 ms |
98348 KB |
Output is correct |
5 |
Correct |
1034 ms |
101584 KB |
Output is correct |
6 |
Correct |
913 ms |
101316 KB |
Output is correct |
7 |
Correct |
1012 ms |
101552 KB |
Output is correct |
8 |
Correct |
1012 ms |
101036 KB |
Output is correct |
9 |
Correct |
907 ms |
98796 KB |
Output is correct |
10 |
Correct |
794 ms |
98308 KB |
Output is correct |
11 |
Correct |
508 ms |
63932 KB |
Output is correct |
12 |
Correct |
988 ms |
99052 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
990 ms |
99416 KB |
Output is correct |
2 |
Correct |
973 ms |
99876 KB |
Output is correct |
3 |
Correct |
1006 ms |
100600 KB |
Output is correct |
4 |
Correct |
1020 ms |
99672 KB |
Output is correct |
5 |
Correct |
1061 ms |
100016 KB |
Output is correct |
6 |
Correct |
1018 ms |
100968 KB |
Output is correct |
7 |
Correct |
1075 ms |
102452 KB |
Output is correct |
8 |
Correct |
1303 ms |
99692 KB |
Output is correct |
9 |
Correct |
1014 ms |
99964 KB |
Output is correct |
10 |
Correct |
1002 ms |
99388 KB |
Output is correct |
11 |
Correct |
605 ms |
64844 KB |
Output is correct |
12 |
Correct |
980 ms |
101268 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
42 ms |
33424 KB |
Output is correct |
2 |
Correct |
15 ms |
24960 KB |
Output is correct |
3 |
Correct |
16 ms |
25012 KB |
Output is correct |
4 |
Correct |
54 ms |
40832 KB |
Output is correct |
5 |
Correct |
35 ms |
33348 KB |
Output is correct |
6 |
Correct |
20 ms |
25308 KB |
Output is correct |
7 |
Correct |
18 ms |
25632 KB |
Output is correct |
8 |
Correct |
20 ms |
26000 KB |
Output is correct |
9 |
Correct |
20 ms |
25236 KB |
Output is correct |
10 |
Correct |
36 ms |
33432 KB |
Output is correct |
11 |
Correct |
16 ms |
24920 KB |
Output is correct |
12 |
Correct |
14 ms |
24908 KB |
Output is correct |
13 |
Correct |
14 ms |
24908 KB |
Output is correct |
14 |
Correct |
15 ms |
25044 KB |
Output is correct |
15 |
Correct |
18 ms |
25036 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
937 ms |
101496 KB |
Output is correct |
2 |
Correct |
891 ms |
99732 KB |
Output is correct |
3 |
Correct |
1010 ms |
102260 KB |
Output is correct |
4 |
Correct |
949 ms |
98348 KB |
Output is correct |
5 |
Correct |
1034 ms |
101584 KB |
Output is correct |
6 |
Correct |
913 ms |
101316 KB |
Output is correct |
7 |
Correct |
1012 ms |
101552 KB |
Output is correct |
8 |
Correct |
1012 ms |
101036 KB |
Output is correct |
9 |
Correct |
907 ms |
98796 KB |
Output is correct |
10 |
Correct |
794 ms |
98308 KB |
Output is correct |
11 |
Correct |
508 ms |
63932 KB |
Output is correct |
12 |
Correct |
988 ms |
99052 KB |
Output is correct |
13 |
Correct |
990 ms |
99416 KB |
Output is correct |
14 |
Correct |
973 ms |
99876 KB |
Output is correct |
15 |
Correct |
1006 ms |
100600 KB |
Output is correct |
16 |
Correct |
1020 ms |
99672 KB |
Output is correct |
17 |
Correct |
1061 ms |
100016 KB |
Output is correct |
18 |
Correct |
1018 ms |
100968 KB |
Output is correct |
19 |
Correct |
1075 ms |
102452 KB |
Output is correct |
20 |
Correct |
1303 ms |
99692 KB |
Output is correct |
21 |
Correct |
1014 ms |
99964 KB |
Output is correct |
22 |
Correct |
1002 ms |
99388 KB |
Output is correct |
23 |
Correct |
605 ms |
64844 KB |
Output is correct |
24 |
Correct |
980 ms |
101268 KB |
Output is correct |
25 |
Correct |
42 ms |
33424 KB |
Output is correct |
26 |
Correct |
15 ms |
24960 KB |
Output is correct |
27 |
Correct |
16 ms |
25012 KB |
Output is correct |
28 |
Correct |
54 ms |
40832 KB |
Output is correct |
29 |
Correct |
35 ms |
33348 KB |
Output is correct |
30 |
Correct |
20 ms |
25308 KB |
Output is correct |
31 |
Correct |
18 ms |
25632 KB |
Output is correct |
32 |
Correct |
20 ms |
26000 KB |
Output is correct |
33 |
Correct |
20 ms |
25236 KB |
Output is correct |
34 |
Correct |
36 ms |
33432 KB |
Output is correct |
35 |
Correct |
16 ms |
24920 KB |
Output is correct |
36 |
Correct |
14 ms |
24908 KB |
Output is correct |
37 |
Correct |
14 ms |
24908 KB |
Output is correct |
38 |
Correct |
15 ms |
25044 KB |
Output is correct |
39 |
Correct |
18 ms |
25036 KB |
Output is correct |
40 |
Correct |
962 ms |
101840 KB |
Output is correct |
41 |
Correct |
1010 ms |
102472 KB |
Output is correct |
42 |
Correct |
960 ms |
103148 KB |
Output is correct |
43 |
Correct |
559 ms |
68236 KB |
Output is correct |
44 |
Correct |
557 ms |
68268 KB |
Output is correct |
45 |
Correct |
940 ms |
111332 KB |
Output is correct |
46 |
Correct |
919 ms |
112380 KB |
Output is correct |
47 |
Correct |
853 ms |
103116 KB |
Output is correct |
48 |
Correct |
561 ms |
67824 KB |
Output is correct |
49 |
Correct |
733 ms |
101572 KB |
Output is correct |
50 |
Correct |
966 ms |
110548 KB |
Output is correct |
51 |
Correct |
916 ms |
112540 KB |
Output is correct |