This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
#define sz(x) (int)(x.size())
#define itr(x) x.begin(), x.end()
#ifdef LOC
#define prv(x) cerr << #x << " : "; for(auto& ov : x) cout << ov << " "; cout << "\n";
#define debug(...) cerr << #__VA_ARGS__ << " : "; for(auto& dval : {__VA_ARGS__}) cerr << dval << " "; cerr << "\n";
#else
#define debug(...)
#define prv(x)
#define LOC 0
#endif
void dijkstra(int s, vector<vector<array<ll,2>>>& adj, vector<ll>& dis) {
priority_queue<array<ll,2>> que;
que.push({0, s});
while(sz(que)) {
ll idx = que.top()[1], d = -que.top()[0];
que.pop();
if(dis[idx] <= d) {
continue;
}
dis[idx] = d;
for(auto& e : adj[idx]) {
que.push({-(d + e[1]), e[0]});
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
if(LOC) {
cerr << "debug mode\n";
}
int n, m, s, t, u, v;
cin >> n >> m >> s >> t >> u >> v;
s--; t--; u--; v--;
vector<array<ll,3>> edges(m);
for(auto& e : edges) {
cin >> e[0] >> e[1] >> e[2];
e[0]--; e[1]--;
}
vector<vector<array<ll,2>>> G(n);
for(auto& e : edges) {
G[e[0]].pb({e[1], e[2]});
G[e[1]].pb({e[0], e[2]});
}
vector<ll> sd(n, INT64_MAX), td(n, INT64_MAX), ud(n, INT64_MAX), vd(n, INT64_MAX);
dijkstra(s, G, sd);
dijkstra(t, G, td);
dijkstra(u, G, ud);
dijkstra(v, G, vd);
vector<int> in(n, 0);
vector<vector<int>> dag(n);
for(auto& e : edges) {
if(sd[e[0]] + e[2] + td[e[1]] == td[s]) {
dag[e[0]].pb(e[1]);
in[e[1]]++;
}
if(sd[e[1]] + e[2] + td[e[0]] == td[s]) {
dag[e[1]].pb(e[0]);
in[e[0]]++;
}
}
prv(in);
vector<int> que;
vector<ll> mnud(n, INT64_MAX / 2), mnvd(n, INT64_MAX / 2);
for(int i = 0; i < n; i++) {
if(in[i] == 0) {
que.pb(i);
}
}
ll ans = ud[v];
while(sz(que) > 0) {
int idx = que.back();
que.pop_back();
mnud[idx] = min(mnud[idx], ud[idx]);
mnvd[idx] = min(mnvd[idx], vd[idx]);
ans = min(ans, mnud[idx] + vd[idx]);
ans = min(ans, mnvd[idx] + ud[idx]);
debug((ll)idx, ans);
for(int e : dag[idx]) {
mnud[e] = min(mnud[e], mnud[idx]);
mnvd[e] = min(mnvd[e], mnvd[idx]);
in[e]--;
if(in[e] == 0) {
que.pb(e);
}
}
}
prv(ud);
prv(vd);
prv(mnud);
prv(mnvd);
cout << ans << "\n";
}
# | 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... |