제출 #1179223

#제출 시각아이디문제언어결과실행 시간메모리
1179223stdfloat사이버랜드 (APIO23_cyberland)C++20
49 / 100
3094 ms7240 KiB
#include <bits/stdc++.h> #include "cyberland.h" // #include "stub.cpp" using namespace std; #define ff first #define ss second #define pii pair<int, int> double solve(int n, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> a) { vector<pii> E[n]; for (int i = 0; i < M; i++) { E[x[i]].push_back({y[i], c[i]}); E[y[i]].push_back({x[i], c[i]}); } queue<int> q; vector<bool> vis(n); q.push(0); vis[0] = true; while (!q.empty()) { int x = q.front(); q.pop(); if (x == H) continue; for (auto [i, w] : E[x]) { if (!vis[i]) { q.push(i); vis[i] = true; } } } if (!vis[H]) return -1; vector<double> dis(n, 1e18); priority_queue<pair<double, int>> pq; for (int i = 0; i < n; i++) { if ((!i || !a[i]) && vis[i]) { dis[i] = 0; pq.push({0, i}); } } double ans = 1e18; while (K--) { vector<double> ndis(n, 1e18); priority_queue<pair<double, int>> npq; while (!pq.empty()) { auto [d, x] = pq.top(); d = -d; pq.pop(); if (x == H || abs(d - dis[x]) > 1e-18) continue; for (auto [i, w] : E[x]) { if (!i || !a[i]) continue; double nd = d + w; if (nd < dis[i]) { dis[i] = nd; pq.push({-nd, i}); } if (a[i] == 2 && x < K && nd < 2 * dis[i]) { ndis[i] = nd / 2; npq.push({-(nd / 2), i}); } } } ans = min(ans, dis[H]); pq = npq; dis = ndis; } 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...