제출 #1116538

#제출 시각아이디문제언어결과실행 시간메모리
1116538staszic_ojuzCommuter Pass (JOI18_commuter_pass)C++17
0 / 100
272 ms24056 KiB
#include<bits/stdc++.h> #ifdef _DEBUG #define ls(x) << x << ", " #define lv(x) << #x << ": " << flush << x << ", " #define pr(x) cout << "Line: " << __LINE__ << ", " x << endl; #else #define ls(x) #define lv(x) #define pr(x) ; #endif using namespace std; typedef unsigned int uint; typedef unsigned long long ull; struct Edge { uint to; ull cost; Edge() {} Edge(uint to, ull cost) : to(to), cost(cost) {} }; struct Vert { uint i; ull cost; Vert() {}; Vert(uint i, ull cost) : i(i), cost(cost) {}; }; bool operator>(const Vert& a, const Vert& b) { return a.cost > b.cost; } constexpr ull ll_inf = 1e14; void djikstra(uint r, uint n, const vector<vector<Edge>>& g, vector<uint> &orig, vector<ull>& cost) { orig.resize(n); cost.resize(n); fill(cost.begin(), cost.end(), ll_inf); fill(orig.begin(), orig.end(), n); priority_queue<Vert, vector<Vert>, greater<Vert>> q; q.push(Vert(r, 0)); cost[r] = 0; orig[r] = 0; while (!q.empty()) { Vert vv = q.top(); uint v = vv.i; pr(ls("visit") lv(v) lv(vv.cost) lv(cost[v])) q.pop(); if (cost[v] < vv.cost) { // better path was found later continue; } for (uint i = 0; i < g[v].size(); i++) { Edge e = g[v][i]; uint k = e.to; pr(lv(i) lv(e.to) lv(e.cost)) if (cost[k] > cost[v] + e.cost) { cost[k] = cost[v] + e.cost; orig[k] = v; pr(ls("neighbour") lv(v) lv(k) lv(e.cost) lv(cost[k])); q.push(Vert(k, cost[k])); } } } pr(ls("end")) } void bfs(uint r, uint w, uint n, const vector<vector<uint>>& g, vector<bool>& visited) { visited.resize(n); fill(visited.begin(), visited.end(), false); stack<uint> st; st.push(r); visited[r] = true; visited[w] = true; // do not enter pr(ls("in") lv(r)) while (!st.empty()) { uint v = st.top(); st.pop(); for (uint x: g[v]) { if (!visited[x]) { visited[x] = true; pr(ls("in") lv(v) lv(x)) st.push(x); } } } } vector<bool> make_on_path(uint s, uint t, uint n, const vector<vector<Edge>>& g) { vector<uint> orig; vector<ull> cost; djikstra(s, n, g, orig, cost); vector<vector<uint>> r_orig(n, vector<uint>()); for (uint i = 0; i < n; i++) { pr(lv(i) lv(orig[i])) r_orig[orig[i]].push_back(i); } vector<bool> is_on_path; bfs(s, t, n, r_orig, is_on_path); for (uint i = 0; i < n; i++) { pr(lv(i) lv(is_on_path[i])) } djikstra(t, n, g, orig, cost); fill(r_orig.begin(), r_orig.end(), vector<uint>()); for (uint i = 0; i < n; i++) { r_orig[orig[i]].push_back(i); } vector<bool> is_on_t; bfs(t, s, n, r_orig, is_on_t); for (uint i = 0; i < n; i++) { if (!is_on_t[i]) { is_on_path[i] = false; } } return is_on_path; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); uint n, m, s, t, u, v; cin >> n >> m; cin >> s >> t; cin >> u >> v; s--; t--; u--; v--; pr(lv(s) lv(t) lv(u) lv(v)) vector<vector<Edge>> g(n, vector<Edge>()); for (uint i = 0; i < m; i++) { uint a, b; ull c; cin >> a >> b >> c; a--; b--; pr(ls(a) ls("->") ls(b)) g[a].push_back(Edge(b, c)); g[b].push_back(Edge(a, c)); } vector<bool> on_path = make_on_path(s, t, n, g); for (uint i = 0; i < n; i++) { pr(lv(i) lv(on_path[i])) } vector<uint> orig; vector<ull> cost; djikstra(u, n, g, orig, cost); ull cost_to_v = cost[v]; ull cost_to_path = ll_inf; for (uint i = 0; i < n; i++) { if (!on_path[i]) continue; pr(lv(i) lv(cost[i])) cost_to_path = min(cost_to_path, cost[i]); } djikstra(v, n, g, orig, cost); ull cost_from_path = ll_inf; for (uint i = 0; i < n; i++) { if (!on_path[i]) continue; cost_from_path = min(cost_from_path, cost[i]); } ull min_cost = min(cost_from_path + cost_to_path, cost_to_v); pr(lv(min_cost) lv(cost_from_path) lv(cost_to_path) lv(cost_to_v)) cout << min_cost << '\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...