Submission #1218844

#TimeUsernameProblemLanguageResultExecution timeMemory
1218844escobrandRobot (JOI21_ho_t4)C++20
100 / 100
2209 ms79504 KiB
#include <bits/stdc++.h> using namespace std; #define all(v) v.begin(),v.end() #define eb push_back #define ll long long #define fi first #define se second int t,n,i,u,v,c,m; ll w; const int maxn = 1e5 + 10; const ll inf = 1e16; struct edge { int to,c; ll w; bool operator < (const edge &b)const { if(w != b.w)return w > b.w; return to > b.to; } }; map<int,vector<edge>>adj[maxn]; map<int,ll> sum[maxn]; ll d[maxn]; map<int,ll> pass[maxn]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; while(m--) { cin>>u>>v>>c>>w; adj[u][c].eb({v,c,w}); adj[v][c].eb({u,c,w}); sum[u][c] += w; sum[v][c] += w; } priority_queue<edge>q; q.push({1,0,0}); for(i = 2;i<=n;i++)d[i] = inf; while(q.size()) { i = q.top().to; w = q.top().w; c = q.top().c; q.pop(); if(c) { if(pass[i][c] != w)continue; for(auto k : adj[i][c]) { ll tmp = sum[i][c] - k.w; if(d[k.to] > tmp + w ) { d[k.to] = tmp + w; q.push({k.to,0,d[k.to]}); } } } else { if(d[i] != w)continue; for(auto j : adj[i]) { for(auto k : j.se) { ll tmp = sum[i][k.c] - k.w; if(d[k.to] > tmp + w) { d[k.to] = tmp + w; q.push({k.to,0,d[k.to]}); } if(d[k.to] > k.w + w) { d[k.to] = k.w + w; q.push({k.to,0,d[k.to]}); } if(pass[k.to].find(k.c) == pass[k.to].end() || pass[k.to][k.c] > w) { pass[k.to][k.c] = w; q.push({k.to,k.c,w}); } } } } } if(d[n] >= inf)d[n] =-1; cout<<d[n]; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...