This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ld long double
#define pb push_back
#define pf push_front
#define vi vector<ll>
#define vii vector<vi>
#define pll pair<ll, ll>
#define vpll vector<pll>
#define all(a) a.begin(), a.end()
#define fi first
#define se second
using namespace std;
const ll mod = 1e9+7;
const ll inf = 1e18;
const ll blocksz = 320;
const ll N = 3e5+8;
ll d[N][4];
int n,m,s,t,x,y;
vpll g[N];
bool use[N];
void dijkstra(int s, int t){
for(int i = 1; i <= n; i++) d[i][t] = inf, use[i] = 0;
priority_queue<pll,vpll,greater<pll>> pq;
pq.push({0,s});
d[s][t] = 0;
while(pq.size()){
int u = pq.top().se;
ll dist = pq.top().fi;
pq.pop();
if(use[u]) continue;
use[u] = 1;
for(pll ed:g[u]){
int v = ed.fi, w = ed.se;
if(d[v][t] > d[u][t]+w){
d[v][t] = d[u][t]+w;
pq.push({d[v][t],v});
}
}
}
}
struct edge{
ll u,v,w;
};
vector<edge> ed;
vector<int> adj[N];
vector<int> topo;
int vst[N];
void tps(int u){
vst[u] = 1;
for(int v:adj[u]){
if(vst[v]) continue;
tps(v);
}
topo.pb(u);
vst[u] = 2;
}
ll dp[2][N];
void solve(){
cin >> n >> m >> s >> t >> x >> y;
for(int i = 1; i <= m; i++){
int u,v,w;cin >> u >> v >> w;
g[u].pb({v,w});
g[v].pb({u,w});
ed.pb({u,v,w});
}
dijkstra(s,0);
dijkstra(t,1);
dijkstra(x,2);
dijkstra(y,3);
for(edge e:ed){
int u = e.u, v = e.v;
ll w = e.w;
if(d[u][0]+w+d[v][1] == d[t][0]) adj[u].pb(v);
else if(d[v][0]+w+d[u][1] == d[t][0]) adj[v].pb(u);
}
tps(s);
for(int i = 1; i <= n; i++) dp[0][i] = dp[1][i] = inf;
for(int u:topo){
dp[0][u] = d[u][2];
dp[1][u] = d[u][3];
for(int v:adj[u]){
dp[0][u] = min(dp[0][u],dp[0][v]);
dp[1][u] = min(dp[1][u],dp[1][v]);
}
}
ll ans = d[y][2];
for(int i = 1; i <= n; i++) ans = min({ans,dp[0][i]+d[i][3],dp[1][i]+d[i][2]});
cout << ans;
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
if (fopen("test.inp", "r")) {
freopen("test.inp", "r", stdin);
freopen("test.out", "w", stdout);
}
ll T = 1;
// cin >> T;
for (ll i = 1; i <= T; i++) {
solve();
cout << '\n';
}
}
Compilation message (stderr)
commuter_pass.cpp: In function 'void dijkstra(int, int)':
commuter_pass.cpp:31:12: warning: unused variable 'dist' [-Wunused-variable]
31 | ll dist = pq.top().fi;
| ^~~~
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:98:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
98 | freopen("test.inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:99:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
99 | freopen("test.out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |