Submission #1103521

#TimeUsernameProblemLanguageResultExecution timeMemory
110352112345678Robot (JOI21_ho_t4)C++17
100 / 100
531 ms49584 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int nx=1e5+5; #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") struct node { ll mn, sm; vector<pair<ll, ll>> d; node(): mn(1e18), sm(0){} }; ll n, m, u, v, c, p, dp[nx]; map<ll, node> mp[nx]; priority_queue<tuple<ll, ll, ll>, vector<tuple<ll, ll, ll>>, greater<tuple<ll, ll, ll>>> pq; int main() { cin.tie(NULL)->sync_with_stdio(false); cin>>n>>m; for (int i=1; i<=m; i++) cin>>u>>v>>c>>p, mp[u][c].d.push_back({v, p}), mp[v][c].d.push_back({u, p}), mp[u][c].sm+=p, mp[v][c].sm+=p; for (int i=2; i<=n; i++) dp[i]=1e18; pq.push({0, 1, -1}); while (!pq.empty()) { auto [cw, u, c]=pq.top(); pq.pop(); if (c==-1&&cw>dp[u]) continue; if (c!=-1&&cw>mp[u][c].mn) continue; if (c==-1) { for (auto [x, d]:mp[u]) { for (auto [v, w]:d.d) { ll cst=min(w, d.sm-w); if (dp[v]>cw+cst) dp[v]=cw+cst, pq.push({dp[v], v, -1}); if (mp[v][x].mn>cw) mp[v][x].mn=cw, pq.push({mp[v][x].mn, v, x}); } } } else { for (auto [v, w]:mp[u][c].d) { if (dp[v]>cw+mp[u][c].sm-w) dp[v]=cw+mp[u][c].sm-w, pq.push({dp[v], v, -1}); } } } if (dp[n]==1e18) cout<<-1; else cout<<dp[n]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...