제출 #1321231

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

using i64 = long long;

struct Data{
    i64 w;
    int ma;
    int u;
    Data () {};
    Data(int _u,int _ma,i64 _w){
        u = _u;
        w = _w;
        ma = _ma;
    }
    bool operator<(const Data d) const{
        return w > d.w;
    }
};

int main(){
        
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n,e,k;
    cin >> n >> e >> k;
    vector<int> good;
    for(int i = 0;i < k;i++){
        int x;
        cin >> x;
        good.push_back(x);
    }
    vector<vector<pair<int,int>>> adj(n);
    for(int i = 0;i < e;i++){
        int u,v,w;
        cin >> u >> v >> w;
        adj[v].push_back({u,w});
    }

    const i64 inf = 1e18;
    int q;
    cin >> q;
    while(q --){
        int s;
        cin >> s;
        vector<int> p(5);
        for(int i = 0;i < 5;i++){
            cin >> p[i];
        }
        vector<vector<i64>> dist(n,vector<i64>(1 << 5,inf));
        priority_queue<Data,vector<Data>> pq;
        for(int &e : good){
            for(int i = 0;i < (1 << 5);i++){
                i64 cost = 0;
                bool ok = true;
                for(int j = 0;j < 5;j++){
                    if((1 << j) & i){
                        if(p[j] == -1) ok = false;
                        cost += p[j];
                    }
                }
                if(ok) pq.push(Data(e,i,cost));
            }
        }

        while(!pq.empty()){
            int u = pq.top().u;
            i64 di = pq.top().w;
            int ma = pq.top().ma;
            pq.pop();
            if(di > dist[u][ma]) continue;
            for(auto pp : adj[u]){
                int v = pp.first;
                int w = pp.second;
                if(w + di < dist[v][ma]){
                    dist[v][ma] = w + di;
                    pq.push(Data(v,ma,w + di));
                }
                for(int j = 0;j < 5;j++){
                    if((1 << j) & ma){
                        // use ticket j
                        i64 rw = w / 10;
                        rw *= (10 - (j + 1));
                        if(rw + di < dist[v][ma ^ (1 << j)]){
                            dist[v][ma ^ (1 << j)] = rw + di;
                            pq.push(Data(v,ma ^ (1 << j),rw + di));
                        }
                    }
                }
            }
        }
        cout << (dist[s][0] == inf ? -1 : dist[s][0]) << '\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...