Submission #1340444

#TimeUsernameProblemLanguageResultExecution timeMemory
1340444norrawichzzzVoting Cities (NOI22_votingcity)C++20
45 / 100
1094 ms4548 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pi pair<int,int>

const int N = 5e3+5, INF=1e18;

vector<int> vote;
vector<vector<pi>> g(N);

int dijk(int st, vector<int> &p) {
    //11011
    priority_queue<pair<int, pi>, vector<pair<int, pi>>, greater<pair<int, pi>>> pq;
    vector<vector<int>> dist(N, vector<int>((1<<5), INF));

    for (int i=0; i<(1<<5); i++) {
        bool ok=true;
        int sm=0;
        for (int j=0; j<5; j++) {
            if (i&(1<<j)) {
                if (p[j] == -1) ok = false;
                else sm += p[j];
            }
        }
        if (ok) {
            pq.push({sm, {st, i}});
            dist[st][i] = sm;
        }
    }
    

    while (!pq.empty()) {
        pair<int, pi> cur = pq.top(); pq.pop();
        int c=cur.first, u=cur.second.first, tic=cur.second.second;

        if (c > dist[u][tic]) continue;

        for (auto &x : g[u]) {
            int v=x.first, w=x.second;

            if (dist[v][tic] > dist[u][tic] + w) {
                dist[v][tic] = dist[u][tic] + w;
                pq.push({dist[v][tic], {v, tic}});
            }
            for (int j=0; j<5; j++) {
                if (tic&(1<<j)) {
                    int nuse = tic ^ (1<<j);
                    
                    int cost = w*(9-j)/10;
                    if (dist[v][nuse] > dist[u][tic] + cost) {
                        dist[v][nuse] = dist[u][tic] + cost;
                        pq.push({dist[v][nuse], {v, nuse}});
                    }
                }
            }
        }
    }
    int mn = INF;
    for (auto &x : vote) {
        mn = min(mn, dist[x][0]);
    }
    if (mn == INF) mn =-1;
    return mn;
}

int32_t main() {
    cin.tie(0)->sync_with_stdio(0);
    int n,m,k;
    cin>> n>> m>> k;
  
    for (int i=0; i<k; i++) {
        int x;
        cin>> x;
        vote.push_back(x);
    }

    for (int i=0; i<m; i++) {
        int u,v,w;
        cin>> u>> v>> w;
        g[u].push_back({v,w});
    }

    int q;
    cin>> q;
    while (q--) {
        int st;
        cin>> st;

        vector<int> p(5);
        for (int i=0; i<5; i++) cin>> p[i];

        cout<< dijk(st, 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...