제출 #633690

#제출 시각아이디문제언어결과실행 시간메모리
633690BlossomstreamRobot (JOI21_ho_t4)C++17
100 / 100
419 ms20396 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; int n, m; int c[200000]; int p[200000]; vector<pair<int, pair<int, int> > > adj[100000]; vector<ll> d; bool visited[100000]; void dijkstra() { d.assign(n, LONG_LONG_MAX); priority_queue<pair<ll, int> > q; d[0] = 0; q.push(make_pair(0, 0)); while(!q.empty()) { int v = q.top().second; q.pop(); if(visited[v]) continue; visited[v] = true; set<int> s; for(auto u : adj[v]) { s.insert(u.second.first); } vector<int> v1; vector<ll> v2; vector<ll> v3; while(!s.empty()) { v1.push_back(*s.begin()); s.erase(*s.begin()); v2.push_back(0); v3.push_back(2000000000000000); } for(auto u : adj[v]) { int l = lower_bound(v1.begin(), v1.end(), u.second.first) - v1.begin(); v2[l] += (ll) u.second.second; v3[l] = min(v3[l], d[u.first]); } for(auto u : adj[v]) { if(visited[u.first]) continue; int l = lower_bound(v1.begin(), v1.end(), u.second.first) - v1.begin(); d[u.first] = min(d[u.first], d[v] + ((ll) u.second.second)); d[u.first] = min(d[u.first], v3[l] + v2[l] - ((ll) u.second.second)); d[u.first] = min(d[u.first], d[v] + v2[l] - ((ll) u.second.second)); q.push(make_pair(-d[u.first], u.first)); } } } int main() { cin >> n >> m; for(int i = 0; i < m; i++) { int a, b, color, cost; cin >> a >> b >> color >> cost; a--; b--; adj[a].push_back(make_pair(b, make_pair(color, cost))); adj[b].push_back(make_pair(a, make_pair(color, cost))); } dijkstra(); if(d[n-1] != LONG_LONG_MAX) cout << d[n-1] << endl; else cout << -1 << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...