제출 #1272270

#제출 시각아이디문제언어결과실행 시간메모리
1272270rana_azkaVoting Cities (NOI22_votingcity)C++20
20 / 100
1096 ms16536 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int INF = 1e18;
const int MOD = 1e9+7;
const int MAXN = 5000;

int n, m;
int voting_cities;
vector<int> list_voting_cities;
vector<pair<int, int>> adj[MAXN+5];
int start;
int ticket[10];
int dist[MAXN+5][50];

void mulaidarinol(){}

void solve(){
    // INPUT
    cin >> n >> m >> voting_cities;
    for(int i = 1; i <= voting_cities; i++){
        int temp; cin >> temp;
        temp++;
        list_voting_cities.push_back(temp);
    }
    for(int i = 1; i <= m; i++){
        int u, v, w; cin >> u >> v >> w;
        u++; v++;
        adj[u].push_back({v, w});
    }

    int q; cin >> q;
    while(q--){
        cin >> start; start++;
        for(int i = 1; i <= 5; i++) cin >> ticket[i];
        
        // INITALIZE 
        for(int i = 1; i <= n; i++){
            for(int j = 0; j <= 40; j++){
                dist[i][j] = INF;
            }
        }

        priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<tuple<int, int, int>>> dijkstra;
        // {dist, mask, cur}
        dijkstra.push({0, 0, start});
        while(!dijkstra.empty()){
            auto [cur_dist, cur_mask, cur] = dijkstra.top();
            dijkstra.pop();
            
            if(dist[cur][cur_mask] <= cur_dist) continue;
            dist[cur][cur_mask] = cur_dist;
            cerr << "cur : " << cur << endl;
            
            for(int bt = 0; bt <= 5; bt++){
                if(ticket[bt] == -1) continue;
                
                int mask = (1 << (bt - 1));
                if(bt == 0) mask = 0;
                if(cur_mask & mask) continue;
                
                for(auto [next, weight] : adj[cur]){
                    int next_mask = cur_mask | mask;
                    int next_dist = dist[cur][cur_mask] + (weight * (10 - bt)  / 10) + ticket[bt]; 
                    
                    if(dist[next][next_mask] <= next_dist) continue;
                    
                    dijkstra.push({next_dist, next_mask, next});
                }
            }
        }
        
        int ans = INF;
        for(auto vote : list_voting_cities){    
            for(int mask = 0; mask <= 40; mask++) ans = min(dist[vote][mask], ans);
        }

        if(ans == INF) ans = -1;
        
        cout << ans << endl;
    }

}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int tc = 1;
    // cin >> tc;
    while(tc--){
        // mulaidarinol();
        solve();
        // cerr << endl;
    }

    return 0;
}

/*
3 2 1
2
0 1 100
1 2 200
1
0 10 20 1000 2000 -1
=> 280

2 0 1
1
1
0 -1 -1 -1 -1 -1
=> -1

6 3 2
4 5
0 4 100
1 4 200
2 5 300
4
0 -1 -1 -1 -1 -1
1 20 40 10 100 4
2 1 2 3 4 0
3 0 -1 0 0 0
=> 100
=> 104
=> 150
=> -1
*/
#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...