Submission #1306466

#TimeUsernameProblemLanguageResultExecution timeMemory
1306466Zone_zoneeVoting Cities (NOI22_votingcity)C++20
100 / 100
186 ms2788 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 5e3+10;

vector<int> cities;
vector<pair<int, ll>> adj[N];
ll dijkstra(int st, int *p){
    ll dist[1<<5][N];
    memset(dist, 0x3f, sizeof dist);
    priority_queue<tuple<ll, int, int>, vector<tuple<ll, int, int>>, greater<tuple<ll, int, int>>> pq;
    int init_state = 0;
    for(int i = 1; i <= 5; ++i) if(p[i] != -1) init_state |= (1<<(i-1));
    pq.push({dist[init_state][st] = 0, st, init_state});
    while(!pq.empty()){
        auto [d, u, state] = pq.top(); pq.pop();
        if(d > dist[state][u]) continue;
        for(auto [v, w] : adj[u]){
            for(int i = 0; i < 5; ++i){
                if(!(state&(1<<i))) continue;
                if(d+w < d+w*(9-i)/10 + p[i+1]) continue;
                if(dist[state^(1<<i)][v] > d+w*(9-i)/10 + p[i+1]){
                    pq.push({dist[state^(1<<i)][v] = d+w*(9-i)/10 + p[i+1], v, state^(1<<i)});
                }
            }
            if(dist[state][v] > d+w){
                pq.push({dist[state][v] = d+w, v, state});
            }
        }
    }
    ll ans = 0x3f3f3f3f3f3f3f3f;
    for(int c : cities){
        for(int i = 0; i < 32; ++i) ans = min(ans, dist[i][c]);
    }
    return (ans == 0x3f3f3f3f3f3f3f3f ? -1 : ans);
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m, k;
    cin >> n >> m >> k;
    for(int i = 1, x; i <= k; ++i){
        cin >> x;
        cities.push_back(x);
    }
    while(m--){
        int u, v, w;
        cin >> u >> v >> w;
        adj[u].push_back({v, w});
    }
    int q;
    cin >> q;
    while(q--){
        int s, p[6];
        cin >> s;
        for(int i = 1; i <= 5; ++i) cin >> p[i];
        cout << dijkstra(s, p) << '\n';
    }
}
#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...