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")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("unroll-loops")
*/
// lethal option
#include<bits/stdc++.h>
using namespace std;
#define all(flg) flg.begin(), flg.end()
#define int long long
#define pb push_back
#define fi first
#define se second
#define endl "\n"
#define eb emplace_back
#define ii pair<int, int>
#define vi vector<int>
#define PI 3.141592653589793238462643383279502884
#define ll long long
#define ld long double
#define for1(i, ff, gg) for(int i = ff; i <= gg; ++i)
#define for2(i, ff, gg) for(int i = ff; i >= gg; --i)
const ll mod = 1e9 + 7;
const int maxN = 300005;
const ll oo = 1e18 + 7;
int n, a[maxN];
int x, y, z, k, s, t, u, v, m;
int du[maxN];
int dv[maxN];
int ds[maxN];
int dt[maxN];
int dp[maxN][4];
vector<ii> vc[maxN];
int ans = oo;
int best;
void dijis(int root, int* ds, bool exec = 0){
priority_queue<ii, vector<ii>, greater<ii>> pq;
for1(i, 0, n) ds[i] = oo;
ds[root] = 0; pq.push(ii(0, root));
while(!pq.empty()){
ii pr = pq.top(); pq.pop();
int node = pr.se, dist = pr.fi;
if(ds[node] == dist){
// cout << node << " " << dist << endl;
bool suu = (exec && ds[node] + dt[node] == best);
if(suu){
// cout << node << " " << dist << endl;
for1(mask, 0, 3) for1(i, 1, 2){
int targ = mask | i;
int &f = dp[node][targ];
if(i == 1) f = min(f, dp[node][mask] + du[node]);
if(i == 2) f = min(f, dp[node][mask] + dv[node]);
}
}
for(ii cc : vc[node]){
int targ = cc.fi + dist;
if(ds[cc.se] > targ){
ds[cc.se] = targ;
pq.push(ii(targ, cc.se));
}
if(suu && ds[cc.se] == targ){
// cout << node << " " << cc.se << endl;
for1(mask, 0, 3){
dp[cc.se][mask] = min(dp[cc.se][mask], dp[node][mask]);
}
}
}
}
}
}
signed main(){
// freopen(".inp", "r", stdin);
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
cin >> s >> t;
cin >> u >> v;
for1(i, 1, m){
cin >> x >> y >> z;
vc[x].pb(ii(z, y));
vc[y].pb(ii(z, x));
}
memset(dp, 15, sizeof(dp));
dijis(u, du);
dijis(v, dv);
ans = min(ans, du[v]);
dijis(t, dt);
best = dt[s];
dp[s][0] = 0;
dijis(s, ds, 1);
ans = min(ans, dp[t][3]);
cout << ans << endl;
}
| # | 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... |