Submission #1310569

#TimeUsernameProblemLanguageResultExecution timeMemory
1310569b_malinowskiCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
326 ms23208 KiB
#include<bits/stdc++.h> using namespace std; using i64 = int64_t; vector<vector<pair<i64, i64>>> con; void Dijkstra(vector<i64>& dij, i64 pocz, i64 N) { priority_queue<pair<i64, i64>, vector<pair<i64, i64>>, greater<pair<i64, i64>>> Q; Q.push({0, pocz}); vector<bool> bylo(N); while (!Q.empty()) { pair<i64, i64> akt = Q.top(); Q.pop(); if (bylo[akt.second]) { continue; } bylo[akt.second] = true; dij[akt.second] = akt.first; for (int i = 0; i < con[akt.second].size(); i++) { Q.push({akt.first + con[akt.second][i].second, con[akt.second][i].first}); } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); i64 N, M, S, T, U, V; cin >> N >> M >> S >> T >> U >> V; S--; T--; U--; V--; con.resize(N); for (int i = 0; i < M; i++) { i64 a, b, c; cin >> a >> b >> c; a--; b--; con[a].push_back({b, c}); con[b].push_back({a, c}); } vector<i64> dis(N), dit(N), div(N), diu(N); Dijkstra(dis, S, N); Dijkstra(dit, T, N); Dijkstra(div, V, N); Dijkstra(diu, U, N); i64 wynik = diu[V], minn = dis[T]; vector<pair<i64, i64>> kopu(N); for (int i = 0; i < N; i++) { kopu[i] = {diu[i], i}; } sort(kopu.begin(), kopu.end()); vector<bool> bylo(N); for (int i = 0; i < N; i++) { i64 poz = kopu[i].second; if (dis[poz] + dit[poz] == minn && !bylo[poz]) { queue<i64> Q; Q.push(poz); while (!Q.empty()) { int akt = Q.front(); Q.pop(); if (bylo[akt]) { continue; } bylo[akt] = true; wynik = min(wynik, div[akt] + kopu[i].first); for (int k = 0; k < con[akt].size(); k++) { int next = con[akt][k].first, cost = con[akt][k].second; if (dis[next] == dis[akt] - cost && dit[next] == dit[akt] + cost) { Q.push(next); } } } } } for (int i = 0; i < N; i++) { bylo[i] = false; } for (int i = 0; i < N; i++) { i64 poz = kopu[i].second; if (dis[poz] + dit[poz] == minn && !bylo[poz]) { queue<i64> Q; Q.push(poz); while (!Q.empty()) { int akt = Q.front(); Q.pop(); if (bylo[akt]) { continue; } bylo[akt] = true; wynik = min(wynik, div[akt] + kopu[i].first); for (int k = 0; k < con[akt].size(); k++) { int next = con[akt][k].first, cost = con[akt][k].second; if (dis[next] == dis[akt] + cost && dit[next] == dit[akt] - cost) { Q.push(next); } } } } } cout << wynik << "\n"; 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...