제출 #476695

#제출 시각아이디문제언어결과실행 시간메모리
476695tranxuanbachRobot (JOI21_ho_t4)C++17
24 / 100
795 ms68924 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define endl '\n' #define fi first #define se second #define For(i, l, r) for (int i = l; i < r; i++) #define ForE(i, l, r) for (int i = l; i <= r; i++) #define FordE(i, l, r) for (int i = l; i >= r; i--) #define Fora(v, a) for (auto v: a) #define bend(a) a.begin(), a.end() #define isz(a) ((signed)a.size()) using ll = long long; using ld = long double; using pii = pair <int, int>; using vi = vector <int>; using vpii = vector <pii>; using vvi = vector <vi>; const int N = 1e5 + 5, M = 2e5 + 5; struct Edge{ int u, v, c, p; Edge(){ } Edge(int u, int v, int c, int p): u(u), v(v), c(c), p(p){ } }; int n, m; Edge edges[2 * M]; vi adj[N]; unordered_map <int, vi> mppc[N]; ll dist[2 * M][3]; priority_queue <tuple <ll, int, int>, vector <tuple <ll, int, int>>, greater <tuple <ll, int, int>>> pq; signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // freopen("KEK.inp", "r", stdin); // freopen("KEK.out", "w", stdout); cin >> n >> m; ForE(i, 1, m){ int u, v, c, p; cin >> u >> v >> c >> p; edges[2 * i - 1] = Edge(u, v, c, p); edges[2 * i] = Edge(v, u, c, p); adj[u].emplace_back(2 * i - 1); adj[v].emplace_back(2 * i); } ForE(i, 1, 2 * m){ mppc[edges[i].u][edges[i].c].emplace_back(i); } memset(dist, 0x3f, sizeof(dist)); dist[1][2] = 0; pq.emplace(dist[1][2], 1, 2); while (!pq.empty()){ ll d; int u, i; tie(d, u, i) = pq.top(); pq.pop(); if (d != dist[u][i]){ continue; } if (i == 2){ Fora(elem, mppc[u]){ if (isz(elem.se) == 1){ if (dist[elem.se[0]][0] > d){ dist[elem.se[0]][0] = d; pq.emplace(dist[elem.se[0]][0], elem.se[0], 0); } } Fora(ti, elem.se){ if (dist[ti][1] > d + edges[ti].p){ dist[ti][1] = d + edges[ti].p; pq.emplace(dist[ti][1], ti, 1); } } } continue; } if (dist[edges[u].v][2] > d){ dist[edges[u].v][2] = d; pq.emplace(dist[edges[u].v][2], edges[u].v, 2); } if (i == 1 and isz(mppc[edges[u].v][edges[u].c]) == 2){ Fora(ti, mppc[edges[u].v][edges[u].c]){ if (ti == (u ^ 1)){ continue; } if (dist[ti][0] > d){ dist[ti][0] = d; pq.emplace(dist[ti][0], ti, 0); } } } } cout << (dist[n][2] == dist[0][0] ? -1 : dist[n][2]) << endl; } /* ==================================================+ INPUT: | --------------------------------------------------| --------------------------------------------------| ==================================================+ OUTPUT: | --------------------------------------------------| --------------------------------------------------| ==================================================+ */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...