제출 #708493

#제출 시각아이디문제언어결과실행 시간메모리
708493finn__Robot (JOI21_ho_t4)C++17
0 / 100
3051 ms54024 KiB
#include <bits/stdc++.h> using namespace std; struct Edge { size_t v, c, p; }; constexpr size_t N = 100000; vector<Edge> g[N]; map<size_t, size_t> ccost[N], f[N]; size_t d[N]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); size_t n, m; cin >> n >> m; for (size_t i = 0; i < m; i++) { size_t u, v, c, p; cin >> u >> v >> c >> p; g[u - 1].push_back({v - 1, c, p}); g[v - 1].push_back({u - 1, c, p}); ccost[u - 1][c] += p; ccost[v - 1][c] += p; } auto compare_state = [](tuple<size_t, size_t, size_t> const &a, tuple<size_t, size_t, size_t> const &b) { return get<1>(a) > get<1>(b); }; priority_queue<tuple<size_t, size_t, size_t>, vector<tuple<size_t, size_t, size_t>>, decltype(compare_state)> q(compare_state); fill(d + 1, d + n, SIZE_MAX); q.emplace(0, 0, 0); while (!q.empty()) { auto const [u, dis, c] = q.top(); q.pop(); if ((!c && dis != d[u]) || (c && dis != f[u][c])) continue; for (auto const &e : g[u]) if (c) // Color just changed. { if (dis + ccost[u][e.c] - e.p < d[e.v]) { d[e.v] = dis + ccost[u][e.c] - e.p; q.emplace(e.v, d[e.v], 0); } } else { if (f[e.v].find(e.c) == f[e.v].end() || dis < f[e.v][e.c]) { f[e.v][e.c] = dis; q.emplace(e.v, dis, 0); } if (dis + e.p < d[e.v]) { d[e.v] = dis + e.p; q.emplace(e.v, d[e.v], 0); } if (dis + ccost[u][e.c] - e.p < d[e.v]) { d[e.v] = dis + ccost[u][e.c] - e.p; q.emplace(e.v, d[e.v], e.c); } } } cout << (d[n - 1] == SIZE_MAX ? -1 : (int64_t)d[n - 1]) << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...