Submission #546094

#TimeUsernameProblemLanguageResultExecution timeMemory
546094someoneRobot (JOI21_ho_t4)C++14
100 / 100
1212 ms127576 KiB
#include <bits/stdc++.h> #define int long long using namespace std; struct Arc { int nex, pds, col; }; struct Sit { int i, col, t; bool operator <(const Sit& other) const { return t > other.t; } }; const int N = 1e5 + 42, M = 4e5 + 42, INF = 1e18 + 42; int n, m, id = 0; priority_queue<Sit> q; vector<Arc> adj[N], adjCol[M]; unordered_map<int, int> idAdj[N]; unordered_map<int, int> tot[N], dist[N]; void Dijkstra() { while(!q.empty()) { Sit sit = q.top(); q.pop(); int i = sit.i, col = sit.col, t = sit.t; if(t == dist[i][col]) { if(col == 0) { for(Arc arc : adj[i]) { if(dist[arc.nex][0] > t + min(arc.pds, tot[i][arc.col] - arc.pds)) { dist[arc.nex][0] = t + min(arc.pds, tot[i][arc.col] - arc.pds); q.push({arc.nex, 0, dist[arc.nex][0]}); } if(dist[arc.nex][arc.col] > t) { dist[arc.nex][arc.col] = t; q.push({arc.nex, arc.col, t}); } } } else { t += tot[i][col]; int j = idAdj[i][col]; for(Arc arc : adjCol[j]) if(dist[arc.nex][0] > t - arc.pds) { dist[arc.nex][0] = t - arc.pds; q.push({arc.nex, 0, t - arc.pds}); } } } } } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; for(int i = 0; i < m; i++) { int a, b, col, pds; cin >> a >> b >> col >> pds; a--, b--; tot[a][col] += pds; tot[b][col] += pds; adj[a].push_back({b, pds, col}); adj[b].push_back({a, pds, col}); dist[a][col] = dist[b][col] = INF; if(idAdj[a].find(col) == idAdj[a].end()) idAdj[a][col] = id++; if(idAdj[b].find(col) == idAdj[b].end()) idAdj[b][col] = id++; adjCol[idAdj[a][col]].push_back({b, pds, col}); adjCol[idAdj[b][col]].push_back({a, pds, col}); } for(int i = 0; i < n; i++) dist[i][0] = INF; for(auto p : dist[0]) { q.push({0, p.first, 0}); dist[0][p.first] = 0; } Dijkstra(); if(dist[n-1][0] == INF) cout << -1; else cout << dist[n-1][0]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...