Submission #1314228

#TimeUsernameProblemLanguageResultExecution timeMemory
1314228aaaaaaaaCyberland (APIO23_cyberland)C++20
5 / 100
1114 ms2162688 KiB
#include <bits/stdc++.h> #include "cyberland.h" using namespace std; const double inf = 1e18; double solve(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr) { vector<pair<int, double>> adj[N + 1]; for(int i = 0; i < M; ++i){ adj[x[i]].push_back({y[i], (double) c[i]}); adj[y[i]].push_back({x[i], (double) c[i]}); } vector<vector<double>> dp(N + 1, vector<double>(K + 1, inf)); priority_queue<tuple<int, int, int>> pq; pq.push({0, -K, 0}); dp[0][K] = 0; while(pq.size()){ auto [dist, rem, node] = pq.top(); pq.pop(); dist = -dist, rem = -rem; if(node == H) continue; if(arr[node] == 0) dist = 0; if(dp[node][rem] < dist) continue; for(auto [v, w] : adj[node]){ if(arr[node] == 1 || arr[node] == 0){ if(dp[v][rem] > dist + w){ dp[v][rem] = dist + w; pq.push({-dp[v][rem], -rem, v}); } }else{ if(dp[v][rem] > dist + w){ dp[v][rem] = dist + w; pq.push({-dp[v][rem], -rem, v}); } if(rem){ if(dp[v][rem - 1] > (dist / 2.0) + w){ dp[v][rem - 1] = (dist / 2.0) + w; pq.push({-dp[v][rem - 1], -(rem - 1), v}); } } } } } double ans = inf; for(int i = 0; i <= K; ++i) ans = min(ans, dp[H][i]); return (ans >= inf ? -1 : ans); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...