Submission #1039576

#TimeUsernameProblemLanguageResultExecution timeMemory
1039576sssamuiCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
284 ms38424 KiB
#include <iostream> #include <cstdio> #include <vector> #include <cmath> #include <queue> using namespace std; using ll = long long; vector<vector<int>> lstadj(1e5 + 1, vector<int>(0)); vector<int> topsort(0); vector<bool> vis(1e5 + 1, false); void dfs(int node) { vis[node] = true; for (int nxt : lstadj[node]) if (!vis[nxt]) dfs(nxt); topsort.push_back(node); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m, s, t, u, v; cin >> n >> m >> s >> t >> u >> v; vector<vector<pair<ll, int>>> adj(n + 1, vector<pair<ll, int>>(0)); while (m--) { int a, b; ll c; cin >> a >> b >> c; adj[a].push_back({ c, b }), adj[b].push_back({ c, a }); } priority_queue<pair<ll, int>> udjk; vector<ll> du(n + 1, -1); udjk.push({ 0, u }); while (!udjk.empty()) { ll d = -udjk.top().first; int node = udjk.top().second; udjk.pop(); if (du[node] == -1) { du[node] = d; for (pair<ll, int> nxt : adj[node]) udjk.push({ -d - nxt.first, nxt.second }); } } vector<ll> dv(n + 1, -1); priority_queue<pair<ll, int>> vdjk; vdjk.push({ 0, v }); while (!vdjk.empty()) { ll d = -vdjk.top().first; int node = vdjk.top().second; vdjk.pop(); if (dv[node] == -1) { dv[node] = d; for (pair<ll, int> nxt : adj[node]) vdjk.push({ -d - nxt.first, nxt.second }); } } vector<ll> ds(n + 1, -1); priority_queue<pair<ll, pair<int, int>>> sdjk; sdjk.push({ 0, {s, 0} }); while (!sdjk.empty()) { ll d = -sdjk.top().first; int node = sdjk.top().second.first, lst = sdjk.top().second.second; sdjk.pop(); if (d == ds[node]) lstadj[node].push_back(lst); else if (ds[node] == -1) { ds[node] = d; if (lst > 0) lstadj[node].push_back(lst); for (pair<ll, int> nxt : adj[node]) sdjk.push({ -d - nxt.first, {nxt.second, node} }); } } dfs(t); vector<int> dtopsort = topsort; vector<ll> ddu = du, ddv = dv; while (!topsort.empty()) { int node = topsort.back(); for (int nxt : lstadj[node]) if (vis[nxt]) if (dv[node] < dv[nxt]) dv[nxt] = dv[node]; topsort.pop_back(); } ll ans = du[n] + dv[n]; for (int i = 1; i < n; i++) if (du[i] + dv[i] < ans) ans = du[i] + dv[i]; while (!dtopsort.empty()) { int node = dtopsort.back(); for (int nxt : lstadj[node]) if (vis[nxt]) if (ddu[node] < ddu[nxt]) ddu[nxt] = ddu[node]; dtopsort.pop_back(); } for (int i = 1; i < n; i++) if (ddu[i] + ddv[i] < ans) ans = ddu[i] + ddv[i]; cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...