Submission #1147380

#TimeUsernameProblemLanguageResultExecution timeMemory
1147380PacybwoahVoting Cities (NOI22_votingcity)C++20
100 / 100
60 ms6492 KiB
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
ll inf = 1e18;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, m, k;
    cin >> n >> m >> k;
    vector<vector<pair<int, ll>>> graph(n);
    vector<int> imp;
    for(int i = 0; i < k; i++){
        int tmp;
        cin >> tmp;
        imp.push_back(tmp);
    }
    for(int i = 0; i < m; i++){
        int a, b, w;
        cin >> a >> b >> w;
        graph[b].emplace_back(a, w);
    }
    vector<vector<ll>> dist(n, vector<ll>(32, inf));
    priority_queue<pair<ll, pair<int, int>>, vector<pair<ll, pair<int, int>>>, greater<pair<ll, pair<int, int>>>> pq;
    for(auto &x: imp){
        dist[x][0] = 0;
        pq.push(make_pair(0, make_pair(x, 0)));
    }
    while(!pq.empty()){
        auto [d, info] = pq.top();
        pq.pop();
        auto &[node, used] = info;
        //cout << d << " " << node << " " << used << "\n";
        if(d > dist[node][used]) continue;
        for(auto &[x, l]: graph[node]){
            for(int i = 0; i < 5; i++){
                if(used & (1 << i)) continue;
                if(d + l * (10 - i - 1) / 10 < dist[x][used + (1 << i)]){
                    dist[x][used + (1 << i)] = d + l * (10 - i - 1) / 10;
                    pq.push(make_pair(dist[x][used + (1 << i)], make_pair(x, used + (1 << i))));
                }
            }
            if(d + l < dist[x][used]){
                dist[x][used] = d + l;
                pq.push(make_pair(dist[x][used], make_pair(x, used)));
            }
        }
    }
    int q;
    cin >> q;
    while(q--){
        int node;
        vector<ll> p(5);
        cin >> node;
        for(int i = 0; i < 5; i++) cin >> p[i];
        ll ans = inf;
        for(int i = 0; i < 32; i++){
            ll sum = 0;
            bool flag = 0;
            for(int j = 0; j < 5; j++) if(i & (1 << j)) sum += p[j];
            for(int j = 0; j < 5; j++) if(i & (1 << j)) if(p[j] == -1) flag = 1;
            if(flag) continue;
            if(sum + dist[node][i] < ans) ans = sum + dist[node][i];
        }
        if(ans == inf) cout << "-1\n";
        else cout << ans << "\n";
    }
}
// g++ -std=c++20 -Wall -Wextra -Wshadow -fsanitize=undefined -fsanitize=address -o run pA.cpp
#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...