제출 #1277322

#제출 시각아이디문제언어결과실행 시간메모리
1277322shirokitoCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
2096 ms22600 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 2e5 + 24; const ll INF = 1e18; int n, m, S, T, U, V; vector<pair<ll, ll>> g[N]; vector<ll> distU, distV, distS; ll dpU[N], dpV[N]; void gen_dist(int start, vector<ll> &dist) { dist.assign(n + 1, INF); dist[start] = 0; vector<bool> vis(n + 1, 0); multiset<pair<ll, ll>> mts; mts.insert({0, start}); while (mts.size()) { auto node = *mts.begin(); mts.erase(mts.find(node)); int u = node.second; if (vis[u]) continue; vis[u] = 1; for (auto [v, w]: g[u]) { if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; mts.insert({dist[v], v}); } } } // cout << start << '\n'; // for (int i = 1; i <= n; i++) { // cout << i << ' ' << dist[i] << '\n'; // } } void dfs(int u) { dpU[u] = min(dpU[u], distU[u]); dpV[u] = min(dpV[u], distV[u]); for (auto [v, w]: g[u]) { if (distS[v] + w == distS[u]) { dpU[v] = min(dpU[v], dpU[u]); dpV[v] = min(dpV[v], dpV[u]); dfs(v); } } } void solve() { cin >> n >> m >> S >> T >> U >> V; for (int i = 1; i <= m; i++) { int u, v, w; cin >> u >> v >> w; g[u].push_back({v, w}); g[v].push_back({u, w}); } gen_dist(S, distS); gen_dist(U, distU); gen_dist(V, distV); fill(dpU, dpU + n + 1, INF); fill(dpV, dpV + n + 1, INF); dfs(T); ll res = INF; for (int i = 1; i <= n; i++) { res = min(res, dpU[i] + distV[i]); res = min(res, dpV[i] + distU[i]); } cout << res << '\n'; } int main() { cin.tie(0) -> sync_with_stdio(0); int TC = 1; // cin >> TC; while (TC--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...