제출 #1325441

#제출 시각아이디문제언어결과실행 시간메모리
1325441zwezdinv사이버랜드 (APIO23_cyberland)C++20
97 / 100
1302 ms59928 KiB
#include <bits/stdc++.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) {
    k = std::min(k, 60);
    std::vector dist(n, std::vector<double>(k + 1, 1e18));
    std::vector<std::vector<std::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]);
    }
    std::priority_queue<std::tuple<double, int, int>, std::vector<std::tuple<double, int, int>>, std::greater<>> pq;
    dist[0][0] = 0;
    pq.emplace(0, 0, 0);
    while (pq.size()) {
        auto [d, u, c] = pq.top();
        pq.pop();
        if (u == h) continue;
        if (dist[u][c] != d) continue;
        for (auto [to, w] : adj[u]) {
            double nd = d + w;
            if (arr[to] == 0) nd = 0;
            if (dist[to][c] > nd) {
                dist[to][c] = nd;
                pq.emplace(nd, to, c);
            }
            if (arr[to] == 2 && c + 1 <= k && dist[to][c + 1] > nd / 2) {
                dist[to][c + 1] = nd / 2;
                pq.emplace(nd / 2, to, c + 1);
            }
        }
    }
    double ans = *std::min_element(dist[h].begin(), dist[h].end());
    if (ans > 1e17) 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...