제출 #1125462

#제출 시각아이디문제언어결과실행 시간메모리
1125462Kel_MahmutRobot (JOI21_ho_t4)C++20
34 / 100
3107 ms883600 KiB
#include <bits/stdc++.h> #define pb push_back #define endl ("\n") #define all(aa) aa.begin(), aa.end() typedef long long ll; using namespace std; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; vector<array<int, 4>> edges(m); vector<vector<array<int, 3>>> g(n); for(int i = 0; i < m; i++){ for(int j = 0; j < 4; j++) cin >> edges[i][j]; edges[i][0]--; edges[i][1]--; } vector<unordered_map<int, ll>> mpp(n); vector<unordered_map<int, pair<ll, ll>>> dir(n); for(int i = 0; i < m; i++){ auto [a, b, c, p] = edges[i]; g[a].pb({b, c, p}); g[b].pb({a, c, p}); mpp[a][c] += p; mpp[b][c] += p; dir[a][b] = make_pair(c, p); dir[b][a] = make_pair(c, p); } priority_queue<array<ll, 3>, vector<array<ll, 3>>, greater<array<ll, 3>>> pq; pq.push({0ll, 0ll, 1ll*n}); vector<unordered_map<int, int>> vis(n + 1); ll ans = LLONG_MAX; while(!pq.empty()){ auto [d, u, par] = pq.top(); pq.pop(); if(vis[par][u]) continue; vis[u][par] = vis[par][u] = 1; if(u == n - 1){ ans = min(ans, d); } for(auto [v, c, p] : g[u]){ if(!vis[u][v]){ ll cost = p; pq.push({d + cost, v, u}); } if(!vis[v][n]){ ll cost = mpp[u][c] - p; if(par != n){ auto [parc, parp] = dir[par][u]; if(parc == c) cost -= parp; } pq.push({d + cost, v, n}); } } } cout << (ans == LLONG_MAX ? -1 : ans) << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...