제출 #1110990

#제출 시각아이디문제언어결과실행 시간메모리
1110990b1hn_4nCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
236 ms28120 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ld long double #define all(x) x.begin(), x.end() #define pii pair<int, int> #define fi first #define se second #define pb emplace_back template <class T> inline bool maximize(T &a, const T &b) {return (a < b ? (a = b, 1) : 0);} template <class T> inline bool minimize(T &a, const T &b) {return (a > b ? (a = b, 1) : 0);} const int N = 1e5 + 5; const ll INF = 1e18; int n, m, s, t, u, v; vector<pii> adj[N]; vector<int> par[N], child[N]; ll disU[N], disV[N], disS[N]; bool reach[N]; ll f[N], g[N], ans; void dijkstra(int st, ll dis[N]){ fill(dis, dis+n+1, INF); dis[st] = 0; priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> q; q.push({0, st}); while (q.size()){ int cur = q.top().se; ll curW = q.top().fi; q.pop(); if (dis[cur] != curW) continue; for (auto[nxt, w] : adj[cur]) if (minimize(dis[nxt], curW + w)) q.push({dis[nxt], nxt}); } } void Dijkstra(int st, ll dis[N]){ fill(dis, dis+n+1, INF); dis[st] = 0; priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> q; q.push({0, st}); while (q.size()){ int cur = q.top().se; ll curW = q.top().fi; q.pop(); if (dis[cur] != curW) continue; for (auto[nxt, w] : adj[cur]){ if (minimize(dis[nxt], curW + w)){ q.push({dis[nxt], nxt}); par[nxt].clear(); par[nxt].push_back(cur); }else if (dis[nxt] == curW + w){ par[nxt].push_back(cur); } } } } ll dfs(int cur){ if (f[cur] != -1) return f[cur]; ll best = disV[cur]; for (int nxt : par[cur]) minimize(best, dfs(nxt)); return f[cur] = best; } ll Dfs(int cur){ if (g[cur] != -1) return g[cur]; ll best = disV[cur]; for (int nxt : child[cur]) minimize(best, Dfs(nxt)); return g[cur] = best; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m >> s >> t >> u >> v; for (int i = 1; i <= m; ++i){ int a, b, w; cin >> a >> b >> w; adj[a].push_back({b, w}); adj[b].push_back({a, w}); } dijkstra(u, disU); dijkstra(v, disV); Dijkstra(s, disS); queue<int> q; q.push(t); while (q.size()){ int cur = q.front(); q.pop(); if (!reach[cur]){ reach[cur] = 1; for (int nxt : par[cur]){ child[nxt].push_back(cur); q.push(nxt); } } } memset(f, -1, sizeof f); memset(g, -1, sizeof g); ans = disU[v]; for (int i = 1; i <= n; ++i) if (reach[i]) minimize(ans, disU[i] + min(dfs(i), Dfs(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...