제출 #1291048

#제출 시각아이디문제언어결과실행 시간메모리
1291048Jawad_Akbar_JJRobot (JOI21_ho_t4)C++20
100 / 100
851 ms96892 KiB
#include <iostream> #include <map> #include <set> #include <vector> #include <algorithm> using namespace std; #define int long long const int N = 1<<18; vector<pair<int,int>> nei[N]; int b[N], a[N], p[N], inf = 1e17; map<int,int> dp[N], Sum[N]; void dijkstra(){ for (int i=2;i < N;i++) dp[i][0] = inf; dp[1][0] = 0; set<pair<int,pair<int,int>>> st = {{0, {1, 0}}}; while (st.size() > 0){ auto [mn, pr] = *st.begin(); auto [u, cl] = pr; st.erase(begin(st)); if (mn != dp[u][cl]) continue; if (cl == 0){ for (auto [col, id] : nei[u]){ int i = b[id] + a[id] - u; if (i == u) continue; if (i != u and dp[i][0] > dp[u][0] + min(p[id], Sum[u][col] - p[id])) dp[i][0] = dp[u][0] + min(p[id], Sum[u][col] - p[id]), st.insert({dp[i][0], {i, 0}}); if (i != u and dp[i][col] > dp[u][0]) dp[i][col] = dp[u][0], st.insert({dp[i][col], {i, col}}); } continue; } int ub = upper_bound(begin(nei[u]), end(nei[u]), make_pair(cl, -cl)) - begin(nei[u]); for (; ub < nei[u].size() and nei[u][ub].first == cl;ub++){ auto [col, id] = nei[u][ub]; int i = b[id] + a[id] - u; if (i != u and dp[i][0] > dp[u][cl] + Sum[u][cl] - p[id]) dp[i][0] = dp[u][cl] + Sum[u][cl] - p[id], st.insert({dp[i][0], {i, 0}}); } } } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, m; cin>>n>>m; for (int i=1, c;i<=m;i++){ cin>>a[i]>>b[i]>>c>>p[i]; nei[a[i]].push_back({c, i}); nei[b[i]].push_back({c, i}); Sum[a[i]][c] += p[i]; Sum[b[i]][c] += p[i]; dp[ a[i]][c] = dp[b[i]][c] = inf; } for (int i=1;i<=n;i++) sort(begin(nei[i]), end(nei[i])); dijkstra(); if (dp[n][0] == inf) dp[n][0] = -1; cout<<dp[n][0]<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...