제출 #1360440

#제출 시각아이디문제언어결과실행 시간메모리
1360440lyra_g13Voting Cities (NOI22_votingcity)C++20
100 / 100
65 ms8556 KiB
#include <bits/stdc++.h>
using ll = long long;
using namespace std;
int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);
  ll n, e, k;
  cin >> n >> e >> k;

  vector<ll> a(k);
  vector<ll> p(5);

  for (auto &i : a) {
    cin >> i;
  }

  vector<vector<pair<ll, ll>>> adj(n + 1);
  for (int i = 0; i < e; i++) {
    ll u, v, c;
    cin >> u >> v >> c;

    adj[v].push_back({u, c});
  }

  vector<vector<ll>> dist(n + 1, vector<ll>(1 << 5, 1e18));
  priority_queue<pair<ll, pair<ll, ll>>> pq;
  for (int i = 0; i < k; i++) {
    dist[a[i]][0] = 0;
    pq.push({0, {a[i], 0}});
  }

  while (!pq.empty()) {
    auto [nd, buff] = pq.top();
    auto [u, dis] = buff;
    pq.pop();

    nd = -nd;

    if (nd > dist[u][dis])
      continue;

    for (auto [v, c] : adj[u]) {
      if (dist[v][dis] > dist[u][dis] + c) {
        dist[v][dis] = dist[u][dis] + c;
        pq.push({-dist[v][dis], {v, dis}});
      }
      ll newdis = dis;
      for (int i = 0; i < 5; i++) {
        if (dis & (1 << i))
          continue;
        newdis = dis | (1 << i);
        ll newc = ((c * (10 - i - 1)) / 10);
        if (dist[v][newdis] > dist[u][dis] + newc) {
          dist[v][newdis] = dist[u][dis] + newc;
          pq.push({-dist[v][newdis], {v, newdis}});
        };
      }
    }
  }

  ll q;
  cin >> q;

  for (int i = 0; i < q; i++) {
    ll u;
    cin >> u;

    for (int j = 0; j < 5; j++) {
      cin >> p[j];
    }

    ll ans = 1e18;
    for (int i = 0; i < (1 << 5); i++) {
      ll add = 0;
      ll check = 0;
      for (int j = 0; j < 5; j++) {
        if (i & (1 << j)) {
          if (p[j] != -1) {
            add += p[j];
          } else {
            check = 1;
          }
        }
      }
      if (check == 0)
        ans = min(ans, dist[u][i] + add);
    }
    if (ans == 1e18) {
      cout << -1 << "\n";
    } else {
      cout << ans << "\n";
    }
  }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…