제출 #1033029

#제출 시각아이디문제언어결과실행 시간메모리
1033029MinhBossRobot (JOI21_ho_t4)C++14
100 / 100
983 ms112624 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second #define pb push_back #define endl '\n' #define int long long const ll MOD = 1e9+7; void add(ll &x, const ll y){ x+= y; if(x>=MOD) x-= MOD; } bool maximize(ll &x, const ll y){ if(x < y){ x = y; return true; } return false; } bool minimize(ll &x, const ll y){ if(x > y){ x = y; return true; } return false; } const ll MAX = 2e5+10, INF = 1e18; ll n,m; ll dp[MAX]; map<ll,ll>dp2[MAX], costSum[MAX]; struct Edge{ ll from, to, color, cost; Edge(ll _from=0, ll _to=0, ll _color=0, ll _cost=0){ from = _from; to = _to; color = _color; cost = _cost; } }; map<ll,vector<Edge>>adj[MAX]; signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); // freopen("shortcut.in","r",stdin); // freopen("shortcut.out","w",stdout); cin>>n>>m; for(int i =1;i<=m;i++){ ll u,v,c,p; cin>>u>>v>>c>>p; adj[u][c].pb(Edge(u,v,c,p)); adj[v][c].pb(Edge(v,u,c,p)); costSum[u][c] += p; costSum[v][c] += p; } memset(dp, 0x3f, sizeof dp); priority_queue<vector<ll>>q; dp[1] = 0; q.push({0,1,0}); while(!q.empty()){ ll u = q.top()[1], c = q.top()[2], cost = q.top()[0]; q.pop(); if(c){ if(dp2[u][c] != -cost) continue; ll case3 = costSum[u][c] - cost; for(auto e : adj[u][c]){ if(case3 - e.cost < dp[e.to]){ dp[e.to] = case3 - e.cost; q.push({-dp[e.to], e.to, 0}); } } } else{ if(dp[u] != -cost) continue; for(auto &j : adj[u]){ for(auto e : j.se){ ll case1 = e.cost - cost; if(case1 < dp[e.to]){ dp[e.to]= case1; q.push({-dp[e.to], e.to,0}); } ll case2 = costSum[u][e.color] - cost - e.cost; if(case2 < dp[e.to]){ dp[e.to] = case2; q.push({-dp[e.to], e.to, 0}); } ll case3 = -cost; if(!dp2[e.to].count(e.color) || dp2[e.to][e.color] > case3){ dp2[e.to][e.color] = case3; q.push({-dp2[e.to][e.color], e.to, e.color}); } } } } } cout<<(dp[n] >= INF ? -1 : dp[n])<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...