제출 #936275

#제출 시각아이디문제언어결과실행 시간메모리
936275SzilCyberland (APIO23_cyberland)C++17
97 / 100
3058 ms163420 KiB
#include "cyberland.h" #include <bits/stdc++.h> using namespace std; using ld = double; const int MAXN = 100'001; const int MAXK = 71; struct Q { ld d; int u, k; bool operator<(const Q &x) const { return d > x.d; } }; vector<pair<int, ld>> g[MAXN]; ld dist[MAXN][MAXK]; bool vis[MAXN]; void dfs(int u, int H) { vis[u] = true; if (u == H) return; for (auto [v, w] : g[u]) { if (!vis[v]) dfs(v, H); } } 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) { for (int i = 0; i < N; i++) { g[i].clear(); vis[i] = false; for (int j = 0; j < MAXK; j++) { dist[i][j] = 1e18; } } for (int i = 0; i < M; i++) { g[x[i]].emplace_back(y[i], c[i]); g[y[i]].emplace_back(x[i], c[i]); } dfs(0, H); if (!vis[H]) { return -1; } priority_queue<Q> pq; for (int i = 0; i < N; i++) { if (vis[i] && (arr[i] == 0 || i == 0)) { pq.push({0, i, 0}); dist[i][0] = 0; } } while (!pq.empty()) { auto [d, u, k] = pq.top(); pq.pop(); if (u == H || abs(dist[u][k] - d) > 1e-9) continue; for (auto [v, w] : g[u]) { if (dist[v][k] > dist[u][k] + w) { dist[v][k] = dist[u][k] + w; pq.push({dist[v][k], v, k}); } if (arr[u] == 2 && k < min(K, MAXK-1) && dist[v][k+1] > dist[u][k] / 2.0 + w) { dist[v][k+1] = dist[u][k] / 2.0 + w; pq.push({dist[v][k+1], v, k+1}); } } } ld ans = 1e18; for (int i = 0; i <= min(K, MAXK-1); i++) { ans = min(ans, dist[H][i]); } 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...