Submission #1283974

#TimeUsernameProblemLanguageResultExecution timeMemory
1283974MisterReaperVoting Cities (NOI22_votingcity)C++20
0 / 100
308 ms2664 KiB
// File votingcity.cpp created on 27.10.2025 at 14:31:29
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

constexpr i64 inf = i64(1E18);

template<typename T>
bool chmin(T& a, T b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}

template<typename T>
using min_pq = std::priority_queue<T, std::vector<T>, std::greater<T>>;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N, M, K;
    std::cin >> N >> M >> K;

    std::vector<int> spec(N);
    for (int i = 0; i < K; ++i) {
        int A;
        std::cin >> A;
        spec[A] = true;
    }

    std::vector<std::array<int, 3>> E(M);
    std::vector<std::vector<int>> adj(N);

    for (int i = 0; i < M; ++i) {
        int A, B, C;
        std::cin >> A >> B >> C;
        E[i] = {A, B, C};
        adj[A].emplace_back(i);
        adj[B].emplace_back(i);
    }

    int Q;
    std::cin >> Q;

    std::vector<std::vector<i64>> dis;
    min_pq<std::tuple<i64, int, int>> pq;

    while (Q--) {
        int S;
        i64 P[5];
        std::cin >> S;
        for (int i = 0; i < 5; ++i) {
            std::cin >> P[i];
            if (P[i] == -1) {
                P[i] = inf;
            }
        }

        dis.assign(N, std::vector<i64>(1 << 5, inf));

        pq.emplace(dis[S][0] = 0, S, 0);
        while (!pq.empty()) {
            auto[d, v, t] = pq.top();
            pq.pop();
            if (dis[v][t] != d) {
                continue;
            }
            for (auto i : adj[v]) {
                int u = E[i][0] ^ E[i][1] ^ v;
                if (chmin(dis[u][t], d + E[i][2])) {
                    pq.emplace(dis[u][t], u, t);
                }
                for (int k = 0; k < 5; ++k) {
                    if (t >> k & 1) {
                        continue;
                    }
                    if (chmin(dis[u][t | 1 << k], d + P[k] + E[i][2] / 10 * (9 - k))) {
                        pq.emplace(dis[u][t | 1 << k], u, t | 1 << k);
                    }
                }
            }
        }

        i64 ans = inf;
        for (int i = 0; i < N; ++i) {
            if (spec[i]) {
                for (int j = 0; j < (1 << 5); ++j) {
                    chmin(ans, dis[i][j]);
                }
            }
        }

        if (ans >= inf) {
            ans = -1;
        }
        std::cout << ans << '\n';
    }

    return 0;
}
#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...