Submission #1253877

#TimeUsernameProblemLanguageResultExecution timeMemory
1253877anfiCyberland (APIO23_cyberland)C++20
15 / 100
513 ms25508 KiB
#include<bits/stdc++.h> using namespace std; #define fi first #define se second const double inf = 1e18; double solve(int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr) { K = min(K, 100); vector<vector<pair<int, int>>> adj(N); vector<vector<double>> dp(N, vector<double>(K+1, inf)); // Build adjacency list for(int i = 0; i < M; i++) { adj[x[i]].emplace_back(y[i], c[i]); adj[y[i]].emplace_back(x[i], c[i]); } // Priority queue: (total_cost, current_node, discounts_used) priority_queue<tuple<double, int, int>, vector<tuple<double, int, int>>, greater<tuple<double, int, int>>> pq; // Initialize dp[0][0] = 0.0; pq.emplace(0.0, 0, 0); // Also push zero-cost nodes if they exist for(int i = 0; i < N; i++) { if(arr[i] == 0) { dp[i][0] = 0.0; pq.emplace(0.0, i, 0); } } while(!pq.empty()) { auto [current_cost, u, used] = pq.top(); pq.pop(); // Skip if we already found a better way if(current_cost > dp[u][used]) continue; // Early termination if we reach the target if(u == H) continue; for(auto &[v, w] : adj[u]) { // Option 1: Don't use discount double new_cost = current_cost + w; if(new_cost < dp[v][used]) { dp[v][used] = new_cost; pq.emplace(new_cost, v, used); } // Option 2: Use discount if available and allowed if(arr[u] == 2 && used < K) { double discounted_cost = current_cost + w/2.0; if(discounted_cost < dp[v][used+1]) { dp[v][used+1] = discounted_cost; pq.emplace(discounted_cost, v, used+1); } } } } // Find the minimal cost to reach H with any number of discounts double ans = *min_element(dp[H].begin(), dp[H].end()); return ans >= inf/2 ? -1.0 : 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...