Submission #1210201

#TimeUsernameProblemLanguageResultExecution timeMemory
1210201kian2009Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
288 ms24700 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll> pll; const int MAXN = 2e5 + 10; const ll INF = 4e18; ll n, m, s, t, s1, e1, h[4][MAXN], dp1[MAXN], dp2[MAXN]; vector<int> num; bool seen[4][MAXN]; vector<pll> adj[MAXN]; void input() { cin >> n >> m >> s >> t >> s1 >> e1; for (int i = 0; i < m; i++) { int x, y, z; cin >> x >> y >> z; adj[x].push_back({y, z}); adj[y].push_back({x, z}); } } void dij1(int c) { priority_queue<pll, vector<pll>, greater<pll>> q; if (c == 0) q.push({0, s}); else if (c == 1) q.push({0, s1}); else if (c == 2) q.push({0, e1}); else q.push({0, t}); while (!q.empty()) { ll u = q.top().second, d = q.top().first; q.pop(); if (!seen[c][u]) { if (c == 0) num.push_back(u); seen[c][u] = true; h[c][u] = d; for (auto p : adj[u]) { int v = p.first, w = p.second; if (!seen[c][v]) q.push({d + w, v}); } } } } void calcDp() { for (auto u : num) { dp1[u] = h[2][u]; for (auto p : adj[u]) { int v = p.first, w = p.second; if ((h[0][v] + w + h[3][u]) == h[0][t]) dp1[u] = min(dp1[u], dp1[v]); } } reverse(num.begin(), num.end()); for (auto u : num) { dp2[u] = h[2][u]; for (auto p : adj[u]) { int v = p.first, w = p.second; if ((h[0][u] + w + h[3][v]) == h[0][t]) dp2[u] = min(dp2[u], dp2[v]); } } } ll findAns() { ll res = INF; for (int i = 1; i <= n; i++) res = min(res, h[1][i] + min(dp1[i], dp2[i])); return res; } int main() { ios::sync_with_stdio(false); cin.tie(0); input(); dij1(0); dij1(1); dij1(2); dij1(3); calcDp(); cout << findAns() << endl; 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...