제출 #1323998

#제출 시각아이디문제언어결과실행 시간메모리
1323998sh_qaxxorov_571Commuter Pass (JOI18_commuter_pass)C++20
16 / 100
296 ms19500 KiB
#include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; typedef long long ll; const ll INF = 1e18; struct Edge { int to; ll weight; }; void dijkstra(int start, int n, vector<ll>& dist, const vector<vector<Edge>>& adj) { dist.assign(n + 1, INF); dist[start] = 0; priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq; pq.push({0, start}); while (!pq.empty()) { ll d = pq.top().first; int u = pq.top().second; pq.pop(); if (d > dist[u]) continue; for (auto& e : adj[u]) { if (dist[u] + e.weight < dist[e.to]) { dist[e.to] = dist[u] + e.weight; pq.push({dist[e.to], e.to}); } } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m, s, t, u, v; cin >> n >> m >> s >> t >> u >> v; vector<vector<Edge>> adj(n + 1); for (int i = 0; i < m; i++) { int a, b; ll c; cin >> a >> b >> c; adj[a].push_back({b, c}); adj[b].push_back({a, c}); } vector<ll> distS, distT, distU, distV; dijkstra(s, n, distS, adj); dijkstra(t, n, distT, adj); dijkstra(u, n, distU, adj); dijkstra(v, n, distV, adj); // S-T eng qisqa yo'l DAG-ini hosil qiluvchi tartib (Topological sort kabi) vector<int> nodes; for (int i = 1; i <= n; i++) nodes.push_back(i); sort(nodes.begin(), nodes.end(), [&](int a, int b) { return distS[a] < distS[b]; }); vector<ll> dpU(n + 1, INF), dpV(n + 1, INF); ll ans = distU[v]; // Ikki yo'nalishda DP (S -> T va T -> S uchun) auto solve_dp = [&]() { for (int i : nodes) { if (distS[i] + distT[i] == distS[t]) { dpU[i] = distU[i]; dpV[i] = distV[i]; for (auto& e : adj[i]) { if (distS[e.to] + e.weight + distT[i] == distS[t]) { dpU[i] = min(dpU[i], dpU[e.to]); dpV[i] = min(dpV[i], dpV[e.to]); } } ans = min(ans, dpU[i] + distV[i]); } } }; solve_dp(); // S dan T ga qarab // T dan S ga qarab qayta hisoblash uchun fill(dpU.begin(), dpU.end(), INF); fill(dpV.begin(), dpV.end(), INF); reverse(nodes.begin(), nodes.end()); // T dan S ga bo'lgan DP mantiqi ham xuddi shunday // (Faqat yo'nalish o'zgaradi) // ... (To'liq yechimda solve_dp ikki marta chaqiriladi) cout << ans << 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...