제출 #1169790

#제출 시각아이디문제언어결과실행 시간메모리
1169790daoquanglinh2007Voting Cities (NOI22_votingcity)C++20
100 / 100
70 ms8376 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pii pair <int, int>
#define fi first
#define se second
#define mp make_pair

const int NM = 5000, inf = 1e18;

int N, E, K, Q, T[NM+5];
vector <pii> adj[NM+5];
int d[NM+5][1<<5];
priority_queue <pair <int, pii>, vector <pair <int, pii> >, greater <pair <int, pii> > > pq;

void dijkstra(){
    for (int i = 0; i < N; i++)
        for (int j = 0; j < (1<<5); j++)
            d[i][j] = +inf;
    for (int i = 0; i < K; i++){
        d[T[i]][0] = 0;
        pq.push(mp(0, mp(T[i], 0)));
    }
    while (!pq.empty()){
        int u = pq.top().se.fi, msk = pq.top().se.se;
        if (d[u][msk] != pq.top().fi){
            pq.pop();
            continue;
        }
        pq.pop();

        for (pii _ : adj[u]){
            int v = _.fi, c = _.se;
            if (d[u][msk]+c < d[v][msk]){
                d[v][msk] = d[u][msk]+c;
                pq.push(mp(d[v][msk], mp(v, msk)));
            }
            for (int i = 0; i < 5; i++){
                if ((msk>>i)&1) continue;
                int nxt_msk = msk+(1<<i), nc = c*(10-i-1)/10;
                if (d[u][msk]+nc < d[v][nxt_msk]){
                    d[v][nxt_msk] = d[u][msk]+nc;
                    pq.push(mp(d[v][nxt_msk], mp(v, nxt_msk)));
                }
            }
        }
    }
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    cin >> N >> E >> K;
    for (int i = 0; i < K; i++) cin >> T[i];
    for (int i = 0; i < E; i++){
        int u, v, c; cin >> u >> v >> c;
        adj[v].push_back(mp(u, c));
    }
    dijkstra();
    cin >> Q;
    while (Q--){
        int S, P[5];
        cin >> S;
        for (int i = 0; i < 5; i++) cin >> P[i];

        int ans = +inf;
        for (int msk = 0; msk < (1<<5); msk++){
            bool chk = 1;
            int res = d[S][msk];
            for (int i = 0; i < 5; i++){
                if (((msk>>i)&1) == 0) continue;
                if (P[i] == -1){
                    chk = 0;
                    break;
                }
                res += P[i];
            }
            if (chk) ans = min(ans, res);
        }
        if (ans == +inf) cout << "-1\n"; else 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...