Submission #286654

#TimeUsernameProblemLanguageResultExecution timeMemory
286654valerikkOlympic Bus (JOI20_ho_t4)C++17
0 / 100
294 ms2808 KiB
#include <bits/stdc++.h> using namespace std; const int N = 205, M = 5e4 + 7; const int INF = 1e9 + 19; const long long LINF = 1e18 + 239; struct Edge { int v, u, c, d; Edge() {} Edge(int v, int u, int c, int d) : v(v), u(u), c(c), d(d) {} }; int n, m; Edge edg[M]; vector <int> find_dist(int s, bool rev, int p[N], vector <int> g[N], int ign = -1) { vector <int> d(n, INF); for (int i = 0; i < n; ++i) p[i] = -1; priority_queue <pair <int, int>, vector <pair <int, int> >, greater <pair <int, int> > > q; d[s] = 0; q.push({0, s}); while (!q.empty()) { auto cur = q.top(); q.pop(); int v = cur.second; if (d[v] != cur.first) continue; for (auto id : g[v]) { if (id == ign) continue; int w = edg[id].c, u = rev ? edg[id].v : edg[id].u; if (d[v] + w < d[u]) { d[u] = d[v] + w; p[u] = id; q.push({d[u], u}); } } } return d; } vector <int> g[N], gr[N]; int p1[N], pn[N]; int rev_p1[N], rev_pn[N]; bool bad1[M], badn[M]; bool rev_bad1[M], rev_badn[M]; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m; for (int i = 0; i < m; ++i) { cin >> edg[i].v >> edg[i].u >> edg[i].c >> edg[i].d; edg[i].v--; edg[i].u--; g[edg[i].v].push_back(i); gr[edg[i].u].push_back(i); } auto d1 = find_dist(0, 0, p1, g); auto dn = find_dist(n - 1, 0, pn, g); auto rev_d1 = find_dist(0, 1, rev_p1, gr); auto rev_dn = find_dist(n - 1, 1, rev_pn, gr); for (int i = 0; i < n; ++i) { if (~p1[i]) bad1[p1[i]] = 1; if (~pn[i]) badn[pn[i]] = 1; if (~rev_p1[i]) rev_bad1[rev_p1[i]] = 1; if (~rev_pn[i]) rev_badn[rev_pn[i]] = 1; } long long ans = LINF; if (d1[n - 1] != INF && dn[0] != INF) ans = (long long)d1[n - 1] + dn[0]; for (int i = 0; i < m; ++i) { vector <int> cur_d1 = bad1[i] ? find_dist(0, 0, p1, g, i) : d1; vector <int> cur_dn = badn[i] ? find_dist(n - 1, 0, pn, g, i) : dn; vector <int> kek_d1 = rev_bad1[i] ? find_dist(0, 1, rev_p1, gr, i) : rev_d1; vector <int> kek_dn = rev_badn[i] ? find_dist(n - 1, 1, rev_pn, gr, i) : rev_dn; long long dist1 = cur_d1[n - 1] == INF ? LINF : cur_d1[n - 1], distn = cur_dn[0] == INF ? LINF : cur_dn[0]; if (cur_d1[edg[i].u] != INF && kek_dn[edg[i].v] != INF) dist1 = min(dist1, (long long)edg[i].c + cur_d1[edg[i].u] + kek_dn[edg[i].v]); if (cur_dn[edg[i].u] != INF && kek_d1[edg[i].v] != INF) distn = min(distn, (long long)edg[i].c + cur_dn[edg[i].u] + kek_d1[edg[i].v]); if (dist1 != LINF && distn != LINF) ans = min(ans, dist1 + distn + edg[i].d); } cout << ans; 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...