Submission #478049

#TimeUsernameProblemLanguageResultExecution timeMemory
478049FireGhost1301Commuter Pass (JOI18_commuter_pass)C++11
16 / 100
403 ms32024 KiB
/** __author__: FireGhost */ #include <bits/stdc++.h> using namespace std; #define fi first #define se second const int N = 1e5 + 3; int n, m, S, T, U, V; vector<pair<int, int>> g[N]; long long d[4][N]; // 0-S, 1-T, 2-U, 3-V vector<int> prv[N], dag[N]; bool vst[N]; long long dp[N], dp2[N]; // dp[u] = đường đi ngắn nhất từ một đỉnh có thể đến được từ u trong DAG, đến đỉnh V. // nói cách khác, xét tập đỉnh X có thể tới được từ u thông qua các cạnh trong DAG, // dp[u] = min(d[3][v]) với mọi v thuộc X. // tương tự, vì prv là đồ thị ngược của dag nên: // xét tập đỉnh Y có thể tới được từ u thông qua các cạnh trong prv, // dp2[u] = min(d[3][v]) với một v thuộc Y. void dijkstra(int s, int id) { priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> pq; d[id][s] = 0; pq.emplace(0, s); while (!pq.empty()) { auto x = pq.top(); pq.pop(); int u = x.se; long long dist = x.fi; if (dist != d[id][u]) continue; for (pair<int, int> e: g[u]) { int v = e.fi, w = e.se; if (d[id][v] > dist + w) { d[id][v] = dist + w; pq.emplace(d[id][v], v); if (id == 0) { prv[v].clear(); prv[v].push_back(u); } } else if (id == 0 && d[id][v] == dist + w) prv[v].push_back(u); } } } void dfs(int u) { vst[u] = true; for (int v: prv[u]) { dag[v].push_back(u); if (!vst[v]) dfs(v); } } void dfs_dp(int u) { dp[u] = d[3][u]; for (int v: dag[u]) { if (dp[v] == LLONG_MAX) dfs_dp(v); dp[u] = min(dp[u], dp[v]); } } void dfs_dp2(int u) { dp2[u] = d[3][u]; for (int v: prv[u]) { if (dp2[v] == LLONG_MAX) dfs_dp2(v); dp2[u] = min(dp2[u], dp2[v]); } } void init() { cin >> n >> m >> S >> T >> U >> V; for (int i = 0; i < m; ++i) { int u, v, w; cin >> u >> v >> w; g[u].emplace_back(v, w); g[v].emplace_back(u, w); } } void solve() { init(); memset(d, 0x3f, sizeof d); dijkstra(S, 0); dijkstra(T, 1); dijkstra(U, 2); dijkstra(V, 3); dfs(T); for (int i = 1; i <= n; ++i) { dp[i] = dp2[i] = LLONG_MAX; } dfs_dp(S); dfs_dp2(T); long long ans = LLONG_MAX; for (int i = 1; i <= n; ++i) { if (d[0][i] + d[1][i] != d[0][T]) continue; ans = min(ans, d[2][i] + min(dp[i], dp2[i])); } cout << ans; } int main() { cin.tie(NULL); ios_base::sync_with_stdio(false); solve(); 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...