제출 #1173726

#제출 시각아이디문제언어결과실행 시간메모리
1173726Spade1사이버랜드 (APIO23_cyberland)C++20
15 / 100
3094 ms23548 KiB
#include "cyberland.h" #include <bits/stdc++.h> #define eb emplace_back #define pii pair<int, int> #define st first #define nd second using namespace std; const int MX = 1e5 + 3; const int MXK = 32; vector<pii> adj[MX]; double dis[MX][MXK]; double solve(int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr) { for (int i = 0; i < N; ++i) adj[i].clear(); for (int i = 0; i < M; ++i) adj[x[i]].eb(y[i], c[i]), adj[y[i]].eb(x[i], c[i]); for (int i = 0; i < N; ++i) for (int j = 0; j <= K; ++j) dis[i][j] = DBL_MAX / 2; priority_queue<pair<double, pii>, vector<pair<double, pii>>, greater<pair<double, pii>>> pq; pq.push({dis[H][0] = 0, {H, 0}}); while (!pq.empty()) { auto d = pq.top().st; auto [a, k] = pq.top().nd; pq.pop(); if (d > dis[a][k]) continue; for (auto [b, w] : adj[a]) { if (d + w < dis[b][k]) pq.push({dis[b][k] = d + w, {b, k}}); if (k < K && arr[b] == 2 && (d + w)/2 <= dis[b][k+1]) pq.push({dis[b][k+1] = (d + w)/2, {b, k+1}}); } } double ans = DBL_MAX; for (int i = 0; i < N; ++i) for (int j = 0; j <= K; ++j) if (arr[i] == 0 || i == 0) ans = min(ans, dis[i][j]); return (ans == DBL_MAX / 2 ? -1 : 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...