Submission #1216565

#TimeUsernameProblemLanguageResultExecution timeMemory
1216565sergiomoncadamcRobot (JOI21_ho_t4)C++20
0 / 100
3065 ms678052 KiB
#include<bits/stdc++.h> using namespace std; #define endl '\n' using ll = long long; using ld = long double; #define pb push_back #define sz size() #define fi first #define se second typedef pair<int, ll> pil; typedef pair<pil, int> pili; typedef pair<pil, pili> pilili; const int maxn = 1e5 + 1; const ll inf = 1e18; vector<vector<pili>> graph(maxn); vector<int> degree(maxn); vector<map<int, ll>> adj(maxn); struct comp{ bool operator() (pilili a, pilili b){ if(a.fi.se == b.fi.se) return a.se.fi.se > b.se.fi.se; return a.fi.se > b.fi.se; } }; // Complejidad O(m*log(n)) ll dijkstra(int n){ vector<ll> d(n+1, inf); d[1] = 0; priority_queue<pilili, vector<pilili>, comp> pq; pq.push({{1, 0}, {{-1, 0}, -1}}); while(!pq.empty()){ int u = pq.top().fi.fi, lastC = pq.top().se.fi.fi, pa = pq.top().se.se; ll w1 = pq.top().fi.se, change = pq.top().se.fi.se; pq.pop(); if(!degree[u]) continue; degree[u]--; // cout<<"u -> "<<u<<" w1 -> "<<w1<<" parent -> "<<pa<<" color -> "<<lastC<<" change -> "<<change<<endl; for(pili edge : graph[u]){ int v = edge.fi.fi, c = edge.se; ll w2 = edge.fi.se; if(pa == v) continue; // cout<<"\tv -> "<<v<<" w2 -> "<<w2<<" c -> "<<c<<" adj -> "<<adj[u][c]<<endl; if(c == lastC){ ll tw = w1 + adj[u][c] - change - w2; d[v] = min(d[v], tw); pq.push({{v, tw}, {{c, 0}, u}}); } else{ ll tw = w1 + adj[u][c] - w2; d[v] = min(d[v], tw); pq.push({{v, tw}, {{c, 0}, u}}); } d[v] = min(d[v], w1 + w2); pq.push({{v, w1 + w2}, {{c, w2}, u}}); } } return d[n]; } void solver(){ int n, m; cin>>n>>m; for(int i = 0; i < m; i++){ int u, v, c; ll w; cin>>u>>v>>c>>w; degree[u] += 2; degree[v] += 2; adj[u][c] += w; adj[v][c] += w; graph[u].pb({{v, w}, c}); graph[v].pb({{u, w}, c}); } ll ans = dijkstra(n); cout<<(ans == inf ? -1 : ans)<<endl; } int main(){ ios_base::sync_with_stdio(0);cin.tie(NULL); int t = 1; // cin>>t; while(t--){ solver(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...