제출 #1188281

#제출 시각아이디문제언어결과실행 시간메모리
1188281alwaus424Commuter Pass (JOI18_commuter_pass)C++20
31 / 100
201 ms42500 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll INF = 1e18; int N, M, S, T, U, V; struct Edge { int to; ll cost; int id; }; vector<vector<Edge>> adj; vector<tuple<int, int, ll>> edges; // Dijkstra: returns shortest distance from src and previous node tracking vector<ll> dijkstra(int src, vector<vector<Edge>>& graph) { vector<ll> dist(N + 1, INF); priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq; dist[src] = 0; pq.emplace(0, src); while (!pq.empty()) { auto [d, u] = pq.top(); pq.pop(); if (d > dist[u]) continue; for (auto& e : graph[u]) { if (dist[e.to] > dist[u] + e.cost) { dist[e.to] = dist[u] + e.cost; pq.emplace(dist[e.to], e.to); } } } return dist; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> M; cin >> S >> T; cin >> U >> V; adj.resize(N + 1); for (int i = 0; i < M; ++i) { int a, b; ll c; cin >> a >> b >> c; adj[a].push_back({b, c, i}); adj[b].push_back({a, c, i}); edges.push_back({a, b, c}); } // First Dijkstra from S and from T vector<ll> distS = dijkstra(S, adj); vector<ll> distT = dijkstra(T, adj); ll minPathST = distS[T]; // Build new graph with some edges 0-cost if they are on some shortest S→T path vector<vector<Edge>> modified(N + 1); for (int i = 0; i < M; ++i) { auto [a, b, c] = edges[i]; bool inShortestPath = false; if (distS[a] + c + distT[b] == minPathST || distS[b] + c + distT[a] == minPathST) { inShortestPath = true; } if (inShortestPath) { modified[a].push_back({b, 0, i}); modified[b].push_back({a, 0, i}); } else { modified[a].push_back({b, c, i}); modified[b].push_back({a, c, i}); } } // Dijkstra on modified graph from U to V vector<ll> distUV = dijkstra(U, modified); cout << distUV[V] << "\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...