제출 #1256526

#제출 시각아이디문제언어결과실행 시간메모리
12565264QT0RCommuter Pass (JOI18_commuter_pass)C++17
16 / 100
202 ms18584 KiB
/* Podzadanie: S = U Złożoność: O(M logN) Dla każdego wierzchołka X rozważamy, jaki jest wynik. Zakładamy, że X jest ostatnim wierzchołkiem ze ścieżki od U do V, który leży na jakiejś najkrótszej ścieżce z S do T. Z U do X docieramy za darmo, a z X do V kosztem odległość X od V. Aby sprawdzić, czy X leży na jakiejś najkrótszej ścieżce z S do T, sprawdzamy czy odległość S do X i odległość X do T sumują się do odległości S do T. */ #include <bits/stdc++.h> using namespace std; using ll = long long; using pll = pair<ll, ll>; ll N, M, S, T, U, V; vector<vector<pll>> graph; const ll oo = 1e18; vector<ll> Dijkstra(ll st) { priority_queue<pll, vector<pll>, greater<pll>> pq; vector<ll> dist(N + 1, oo); dist[st] = 0; pq.push({0, st}); while (pq.size()) { auto [d, v] = pq.top(); pq.pop(); if (d != dist[v]) continue; for (auto [u, c] : graph[v]) { if (d + c < dist[u]) { dist[u] = d + c; pq.push({dist[u], u}); } } } return dist; } void init() { cin >> N >> M >> S >> T >> U >> V; graph.resize(N + 1); for (ll i = 1, a, b, c; i <= M; i++) { cin >> a >> b >> c; graph[a].push_back({b, c}); graph[b].push_back({a, c}); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); init(); vector<ll> dist_from_S = Dijkstra(S); vector<ll> dist_from_T = Dijkstra(T); vector<ll> dist_from_V = Dijkstra(V); ll ans = oo; for (ll X = 1; X <= N; X++) { if (dist_from_S[X] + dist_from_T[X] == dist_from_S[T]) ans = min(ans, dist_from_V[X]); } cout << ans << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...