Submission #1179216

#TimeUsernameProblemLanguageResultExecution timeMemory
1179216stdfloatCyberland (APIO23_cyberland)C++20
49 / 100
3119 ms1572076 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;

    priority_queue<pair<double, pii>> pq;
    vector<vector<double>> dis(n, vector<double>(K + 1, 1e18));

    for (int i = 0; i < n; i++) {
        if ((!i || !a[i]) && vis[i]) {
            dis[i][0] = 0;
            pq.push({0, {i, 0}});
        }
    }

    while (!pq.empty()) {
        auto [d, x] = pq.top(); d = -d; pq.pop();
    
        if (x.ff == H || abs(d - dis[x.ff][x.ss]) > 1e-18) continue;

        for (auto [i, w] : E[x.ff]) {
            if (!i || !a[i]) continue;

            double nd = d + w;

            if (nd < dis[i][x.ss]) {
                dis[i][x.ss] = nd;
                pq.push({-nd, {i, x.ss}});
            }
            if (a[i] == 2 && x.ss < K && nd < 2 * dis[i][x.ss]) {
                dis[i][x.ss + 1] = nd / 2;
                pq.push({-(nd / 2), {i, x.ss + 1}});
            }
        }
    }

    return *min_element(dis[H].begin(), dis[H].end());
}
#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...