Submission #1158466

#TimeUsernameProblemLanguageResultExecution timeMemory
1158466farrellwCyberland (APIO23_cyberland)C++20
15 / 100
946 ms2162688 KiB
#include "cyberland.h" #include <vector> #include <queue> #include <tuple> using namespace std; typedef long double ld; const ld INF = 1e18; struct State { ld cost; int node; int used; // number of divide-by-2 actions used so far bool operator>(const State &other) const { return cost > other.cost; } }; 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) { // Build the graph. vector<vector<pair<int,int>>> adj(N); for (int i = 0; i < M; i++) { adj[x[i]].push_back({y[i], c[i]}); adj[y[i]].push_back({x[i], c[i]}); } // We'll keep the best cost to reach each (node, usedDivide) state. vector<vector<ld>> dist(N, vector<ld>(K + 1, INF)); // Priority queue for Dijkstra: (cost, node, usedDivide) priority_queue<State, vector<State>, greater<State>> pq; // Start from country 0 with cost 0 and no divide-by-2 operations used. dist[0][0] = 0; pq.push({0, 0, 0}); while (!pq.empty()) { State cur = pq.top(); pq.pop(); ld d = cur.cost; int u = cur.node; int used = cur.used; if (d != dist[u][used]) continue; // outdated state // If we reached Cyberland, we have an answer. if (u == H) return (double)d; // At the current node, you may choose to use its special ability. // Note: You can use the ability at most once per visit. // For a clear ability (arr[u] == 0), your total cost resets to 0. if (arr[u] == 0) { if (d != 0 && 0 < dist[u][used]) { dist[u][used] = 0; pq.push({0, u, used}); } } // For a divide-by-2 ability, you must not have exceeded K uses. if (arr[u] == 2 && used < K) { ld newCost = d / 2.0; if (newCost < dist[u][used + 1]) { dist[u][used + 1] = newCost; pq.push({newCost, u, used + 1}); } } // Now relax all outgoing edges (without using any ability at the current node). for (auto &edge : adj[u]) { int v = edge.first; int w = edge.second; ld nd = d + w; if (nd < dist[v][used]) { dist[v][used] = nd; pq.push({nd, v, used}); } } } return -1; }
#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...