Submission #605434

#TimeUsernameProblemLanguageResultExecution timeMemory
605434jjianglyCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
474 ms40264 KiB
#include <bits/stdc++.h> using namespace std; #define all(x) x.begin(), x.end() #define siz(x) int(x.size()) #define ll long long #define ar array #define vt vector #define inf int(1e9) #define lnf (long long) 1e15 const int nxm = int(1e5) + 7; int n, m, S, T, U, V; namespace sub1 { vt<vt<ar<int, 2>>> e(nxm); vt<vt<ll>> d(3, vt<ll> (nxm, lnf)); void exe() { for (int i = 0; i < m; ++i) { int a, b, c; cin >> a >> b >> c; --a, --b; e[a].push_back({c, b}); e[b].push_back({c, a}); } function<void(int, int)> dijkstra = [&](int root, int id) { priority_queue<ar<ll, 2>, vt<ar<ll, 2>>, greater<ar<ll, 2>>> que; que.push({0, root}); d[id][root] = 0; while (que.size()) { ll du = que.top()[0]; int u = que.top()[1]; que.pop(); if (du != d[id][u]) { continue; } for (int i = 0; i < siz(e[u]); ++i) { ll c = e[u][i][0]; int v = e[u][i][1]; if (d[id][v] > du + c) { d[id][v] = du + c; que.push({d[id][v], v}); } } } }; dijkstra(S, 0); dijkstra(T, 1); dijkstra(V, 2); ll ans = d[0][V]; for (int i = 0; i < n; ++i) { if (d[0][i] + d[1][i] == d[0][T]) { ans = min(ans, d[2][i]); } } cout << ans << "\n"; } }; namespace sub2 { vt<vt<ar<int, 2>>> e(nxm); vt<vt<ll>> d(4, vt<ll> (nxm, lnf)); void exe() { for (int i = 0; i < m; ++i) { int a, b, c; cin >> a >> b >> c; --a, --b; e[a].push_back({c, b}); e[b].push_back({c, a}); } function<void(int, int)> dijkstra = [&](int root, int id) { priority_queue<ar<ll, 2>, vt<ar<ll, 2>>, greater<ar<ll, 2>>> que; que.push({0, root}); d[id][root] = 0; while (que.size()) { ll du = que.top()[0]; int u = que.top()[1]; que.pop(); if (d[id][u] != du) { continue; } for (int i = 0; i < siz(e[u]); ++i) { ll c = e[u][i][0]; int v = e[u][i][1]; if (d[id][v] > du + c) { d[id][v] = du + c; que.push({d[id][v], v}); } } } }; dijkstra(S, 0); dijkstra(T, 1); dijkstra(U, 2); dijkstra(V, 3); vt<int> path; for (int i = 0; i < n; ++i) { if (d[0][i] + d[1][i] == d[0][T]) { path.push_back(i); } } ll ans = d[2][V]; ll r = lnf, r2 = lnf; for (int i : path) { r = min(r, d[2][i]); r2 = min(r2, d[3][i]); } cout << min(ans, r + r2) << "\n"; } }; namespace sub3 { ll e[305][305]; void exe() { for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { e[i][j] = lnf; } } for (int i = 0; i < n; ++i) { e[i][i] = 0; } for (int i = 0; i < m; ++i) { int a, b; cin >> a >> b; --a, --b; cin >> e[a][b]; e[b][a] = e[a][b]; } for (int k = 0; k < n; ++k) { for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (e[i][k] != lnf && e[k][j] != lnf) { e[i][j] = min(e[i][j], e[i][k] + e[k][j]); } } } } ll ans = e[U][V]; //cout << e[4][0] + e[0][1] + e[1][6] << " " << e[4][6] << " " << e[5][1] << " " << e[0][7] << "\n"; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (e[S][i] + e[i][j] + e[j][T] == e[S][T]) { ans = min(ans, e[U][i] + e[j][V]); ans = min(ans, e[U][j] + e[i][V]); } } } cout << ans << "\n"; } }; namespace sub4 { vt<vt<ar<int, 3>>> e(nxm); vt<vt<ll>> d(4, vt<ll> (nxm, lnf)); void exe() { for (int i = 0; i < m; ++i) { int a, b, c; cin >> a >> b >> c; --a, --b; e[a].push_back({c, b}); e[b].push_back({c, a}); } function<void(int, int)> dijkstra = [&](int root, int id) { priority_queue<ar<ll, 2>, vt<ar<ll, 2>>, greater<ar<ll, 2>>> que; que.push({0, root}); d[id][root] = 0; while (que.size()) { ll du = que.top()[0]; int u = que.top()[1]; que.pop(); if (du != d[id][u]) { continue; } for (int i = 0; i < siz(e[u]); ++i) { ll c = e[u][i][0]; int v = e[u][i][1]; if (d[id][v] > du + c) { d[id][v] = du + c; que.push({d[id][v], v}); } } } }; dijkstra(S, 0); dijkstra(T, 1); dijkstra(U, 2); dijkstra(V, 3); vt<vt<int>> p(n); function<void(int)> work = [&](int root) { priority_queue<ar<ll, 2>, vt<ar<ll, 2>>, greater<ar<ll, 2>>> que; que.push({0, root}); vt<ll> d2(n, lnf); d2[root] = 0; while (que.size()) { ll du = que.top()[0]; int u = que.top()[1]; que.pop(); if (du != d2[u]) { continue; } for (int i = 0; i < siz(e[u]); ++i) { ll c = e[u][i][0]; int v = e[u][i][1]; if (d2[v] > du + c) { d2[v] = du + c; que.push({d2[v], v}); } if (du + c == d[0][v]) { p[v].push_back(u); } } } }; work(S); vt<vt<int>> child(n); queue<int> que; que.push(T); vt<bool> vis(n, false); while (que.size()) { int u = que.front(); que.pop(); if (!vis[u]) { vis[u] = true; for (int v : p[u]) { child[v].push_back(u); que.push(v); } } } vt<ll> dp(n, -1); vt<ll> dp2(n, -1); function<ll(int)> dpnext = [&](int u) { if (dp[u] != -1) { return dp[u]; } ll res = d[3][u]; for (int v : child[u]) { res = min(res, dpnext(v)); } return dp[u] = res; }; function<ll(int)> dpforward = [&](int u) { if (dp2[u] != -1) { return dp2[u]; } ll res = d[3][u]; for (int v : p[u]) { res = min(res, dpforward(v)); } return dp2[u] = res; }; ll ans = d[3][U]; for (int i = 0; i < n; ++i) { if (vis[i]) { ans = min(ans, d[2][i] + min(dpnext(i), dpforward(i))); } } cout << ans << "\n"; } }; int subtask() { if (S == U) { return 1; } else if (n <= 300) { return 3; } return 4; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> S >> T >> U >> V; --S, --T, --U, --V; if (subtask() == 1) { sub1::exe(); } else if (subtask() == 2) { sub2::exe(); } else if (subtask() == 3) { sub3::exe(); } else { sub4::exe(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...