제출 #1102201

#제출 시각아이디문제언어결과실행 시간메모리
1102201_8_8_Commuter Pass (JOI18_commuter_pass)C++17
100 / 100
352 ms41072 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 3e5 + 12, MOD = 998244353; ll inf = 1e18; int n, m, s, t, u, v; vector<pair<int, int>> g[N]; vector<int> G[N]; vector<array<int, 3>> e; vector<ll> dijkstra(vector<int> vec) { vector<ll> d(n, inf); set<pair<ll ,int>> st; for(int i:vec) { st.insert({0, i}); d[i] = 0; } while(!st.empty()) { int v = (*st.begin()).second; st.erase(st.begin()); for(auto [to, w]:g[v]) { if(d[to] > d[v] + w) { st.erase({d[to], to}); d[to] = d[v] + w; st.insert({d[to], to}); } } } return d; } vector<int> ord; bool vis[N]; ll dp[N], pd[N]; void dfs(int v) { vis[v] = 1; for(int to:G[v]) { if(!vis[to]) { dfs(to); } } ord.push_back(v); } void test() { cin >> n >> m; cin >> s >> t >> v >> u; s--;t--;u--;v--; for(int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; u--;v--; e.push_back({u, v, w}); g[u].emplace_back(v, w); g[v].emplace_back(u, w); } vector<ll> d = dijkstra({s}), dn = dijkstra({t}); ll D = d[t]; for(auto [x, y, w]:e) { if(D == w + d[x] + dn[y]) { G[x].push_back(y); } else if(D == w + d[y] + dn[x]) { G[y].push_back(x); } } for(int i = 0; i < n; i++) { if(!vis[i] && !G[i].empty()) { dfs(i); } } vector<ll> du = dijkstra({u}), dv = dijkstra({v}); ll res = du[v]; for(int i:ord) { // cout << i + 1 << ' '; dp[i] = du[i]; pd[i] = dv[i]; for(int to:G[i]) { dp[i] = min(dp[i], dp[to]); pd[i] = min(pd[i], pd[to]); } res = min({res, dp[i] + dv[i], pd[i] + du[i]}); } // cout << '\n'; cout << res << '\n'; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t = 1; // cin >> t; while(t--) test(); 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...