제출 #1185426

#제출 시각아이디문제언어결과실행 시간메모리
1185426epicci23Voting Cities (NOI22_votingcity)C++20
100 / 100
67 ms8376 KiB
#include "bits/stdc++.h"
#define int long long
#define all(v) v.begin() , v.end()
#define sz(a) (int) a.size()
using namespace std;

const int N = 5005;
const int INF = 1e18;
const int LOG = 32;

int n, m, k, mark[N];
vector<array<int,2>> v[N];

void _(){
  cin >> n >> m >> k;
  
  for(int i = 0; i < k; i++){
  	int a; cin >> a;
  	mark[a] = 1;
  }

  for(int i = 0; i < m; i++){
  	int a,b,c;
  	cin >> a >> b >> c;
  	v[b].push_back({a, c});
  }	

  array<int,LOG> dist[n+5];
  for(int i=0;i<n;i++) for(int j=0;j<LOG;j++) dist[i][j] = INF;
  priority_queue<array<int,3>,vector<array<int,3>>,greater<>> pq;
  
  for(int i = 0; i < n; i++){
  	if(mark[i]){
  	  dist[i][0] = 0;
  	  pq.push({0, i, 0});
  	}
  }

  while(!pq.empty()){

      int c = pq.top()[1];
      int d = pq.top()[0];
      int mask = pq.top()[2];
      pq.pop();
      if(d > dist[c][mask]) continue;

      for(auto [u, w] : v[c]){
        if(d + w < dist[u][mask]){
          dist[u][mask] = d + w;
          pq.push({d + w, u, mask});
        }
      }

      for(int i = 0; i < 5; i++){
        if(mask>>i&1) continue;
        for(auto [u, w] : v[c]){
          if(w - (i + 1) * (w / 10) + d < dist[u][mask ^ (1 << i)]){
            dist[u][mask ^ (1 << i)] = w - (i + 1) * (w / 10) + d;
            pq.push({w - (i + 1) * (w / 10) + d, u, mask ^ (1 << i)});
          }
        }
      }
  }

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

  	int st,pr[5];
    cin >> st;

    for(int i = 0; i < 5; i++){
      cin >> pr[i];
      if(pr[i] == -1) pr[i] = INF;
    }

    int ans = INF;
    for(int i = 0; i < LOG; i++){
      int cur = dist[st][i];
      for(int j = 0; j < 5; j++) if(i>>j&1) cur += pr[j];
      ans = min(ans, cur);
    }
    
    if(ans == INF) cout << -1 << '\n';
    else cout << ans << '\n';
  }
}

int32_t main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tc=1;//cin >> tc;
  while(tc--) _();
  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...