제출 #1309362

#제출 시각아이디문제언어결과실행 시간메모리
1309362azamurai사이버랜드 (APIO23_cyberland)C++20
15 / 100
1062 ms2162688 KiB
#include <bits/stdc++.h> using namespace std; double solve( int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr ) { const double INF = 1e18; // граф vector<vector<pair<int,double>>> g(N); for (int i = 0; i < M; i++) { g[x[i]].push_back({y[i], c[i]}); g[y[i]].push_back({x[i], c[i]}); } // dp[k][v] = минимальное время vector<vector<double>> dp(K + 1, vector<double>(N, INF)); priority_queue< pair<double, pair<int,int>>, vector<pair<double, pair<int,int>>>, greater<> > pq; dp[0][0] = 0; pq.push({0, {0, 0}}); while (!pq.empty()) { auto [dist, state] = pq.top(); pq.pop(); int v = state.first; int used = state.second; if (dp[used][v] != dist) continue; // способность arr[v] = 0 (обнуление) if (arr[v] == 0 && dist > 0) { if (dp[used][v] > 0) { dp[used][v] = 0; pq.push({0, {v, used}}); } } for (auto [u, w] : g[v]) { double nd = dist + w; // обычный переход if (dp[used][u] > nd) { dp[used][u] = nd; pq.push({nd, {u, used}}); } // деление на 2 if (arr[u] == 2 && used < K) { double nd2 = nd * 0.5; if (dp[used + 1][u] > nd2) { dp[used + 1][u] = nd2; pq.push({nd2, {u, used + 1}}); } } } } double ans = INF; for (int i = 0; i <= K; i++) { ans = min(ans, dp[i][H]); } if (ans >= INF / 2) return -1; return 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...