Submission #1302146

#TimeUsernameProblemLanguageResultExecution timeMemory
1302146duyanhchupapiCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
161 ms28944 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 1e5 + 5; const ll inf = 1e18; int n, m, uu, vv, s, t, deg[N], topo[N]; vector <pair<int, int>> g[N]; vector <int> adj[N], radj[N]; ll dist[3][N], dp[N]; bool vis[N]; void dijkstra(int u, int id) { fill(dist[id], dist[id] + n + 1, inf); dist[id][u] = 0; priority_queue <pair<int, int>, vector <pair<int, int>>, greater<pair<int, int>>> pq; pq.emplace(0, u); while (!pq.empty()) { int u = pq.top().second; ll du = pq.top().first; pq.pop(); if (du != dist[id][u]) continue; for (pair <int, int> P : g[u]) { int v = P.first, w = P.second; if (du + w < dist[id][v]) { dist[id][v] = du + w; pq.emplace(dist[id][v], v); } } } } vector <int> luu; void dfs(int u) { luu.push_back(u); vis[u] = 1; for (pair <int, int> P : g[u]) { int v = P.first, w = P.second; if (dist[0][u] == dist[0][v] + w) { deg[u]++; adj[v].push_back(u); radj[u].push_back(v); if (!vis[v]) dfs(v); } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); //freopen("test.inp", "r", stdin); // freopen(".OUT", "w", stdout); cin >> n >> m >> s >> t >> uu >> vv; while (m--) { int a, b, c; cin >> a >> b >> c; g[a].emplace_back(b, c); g[b].emplace_back(a, c); } dijkstra(s, 0); dijkstra(uu, 1); dijkstra(vv, 2); dfs(t); queue <int> q; int idd = 0; ll ans = dist[1][vv]; for (int u : luu) if (deg[u] == 0) q.push(u); while (!q.empty()) { int u = q.front(); q.pop(); topo[++idd] = u; for (int v : adj[u]) if (--deg[v] == 0) q.push(v); } for (int i=idd;i>=1;--i) { int u = topo[i]; dp[u] = dist[2][u]; for (int v : adj[u]) dp[u] = min(dp[u], dp[v]); ans = min(ans, dist[1][u] + dp[u]); } fill(dp, dp + idd + 1, 0); for (int i=1;i<=idd;++i) { int u = topo[i]; dp[u] = dist[2][u]; for (int v : radj[u]) dp[u] = min(dp[u], dp[v]); ans = min(ans, dist[1][u] + dp[u]); } 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...