Submission #1340438

#TimeUsernameProblemLanguageResultExecution timeMemory
1340438norrawichzzzVoting Cities (NOI22_votingcity)C++20
0 / 100
288 ms3120 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));
    pq.push({0, {st, 0}});
    dist[st][0] = 0;

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

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

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

            if (dist[v][used] > dist[u][used] + w) {
                dist[v][used] = dist[u][used] + w;
                pq.push({dist[v][used], {v, used}});
            }
            for (int j=0; j<5; j++) {
                if (p[j] != -1) {
                    if (used&(1<<j)) continue;
                    else {
                        int nuse = used ^ (1<<j);
                        
                        int cost = w*(9-j)/10 + p[j];
                        if (dist[v][nuse] > dist[u][used] + cost) {
                            dist[v][nuse] = dist[u][used] + cost;
                            pq.push({dist[v][nuse], {v, nuse}});
                        }
                    }
                }
            }
        }
    }
    int mn = INF;
    for (auto &x : vote) {
        for (int i=0; i<(1<<5); i++) mn = min(mn, dist[x][i]);
    }
    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});
        g[v].push_back({u,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...