Submission #1252652

#TimeUsernameProblemLanguageResultExecution timeMemory
1252652anfiCyberland (APIO23_cyberland)C++20
15 / 100
1391 ms1998432 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second const double INF = 1e30; double solve(int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr){ vector<pair<int,int>> adj[N]; 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]); } vector<vector<double>> dist(N, vector<double>(K+1, INF)); priority_queue<tuple<double,int,int>, vector<tuple<double,int,int>>, greater<>> pq; dist[0][0] = 0.0; pq.emplace(0.0, 0, 0); while(!pq.empty()){ auto [cost, u, kused] = pq.top(); pq.pop(); if(cost > dist[u][kused] + 1e-9) continue; for(auto &[v, w] : adj[u]){ double ncost = cost + w; // 1. Normal move if(dist[v][kused] > ncost + 1e-9){ dist[v][kused] = ncost; pq.emplace(ncost, v, kused); } // 2. Jika negara v adalah tipe RESET (arr[v] == 0), kita bisa reset waktu ke 0 setelah sampai di v if(arr[v] == 0 && dist[v][kused] > 0.0 + 1e-9){ dist[v][kused] = 0.0; pq.emplace(0.0, v, kused); } // 3. Jika negara v adalah bagi-dua (arr[v]==2) dan kita belum pakai K kali if(arr[v] == 2 && kused < K){ double hcost = ncost / 2.0; if(dist[v][kused+1] > hcost + 1e-9){ dist[v][kused+1] = hcost; pq.emplace(hcost, v, kused+1); } } } } double ans = INF; for(int i = 0; i <= K; i++) ans = min(ans, dist[H][i]); 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...