제출 #1245883

#제출 시각아이디문제언어결과실행 시간메모리
1245883daotuankhoiCities (BOI16_cities)C++20
74 / 100
748 ms40536 KiB
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif

const int64_t INF = 0x3f3f3f3f3f3f3f3f;
int special[5];
const int MAXN = 1e5;
int64_t dp[1 << 5][MAXN];
vector<pair<int, int>> g[MAXN];
int n, m, k;

void dijkstra(int mask) {
  using T = pair<int64_t, int>;
  priority_queue<T, vector<T>, greater<T>> pq;
  for (int i = 1; i <= n; i++) {
    if (dp[mask][i] != INF) {
      pq.emplace(dp[mask][i], i);
    }
  }
  while (pq.size()) {
    auto [d, u] = pq.top();
    pq.pop();
    if (d > dp[mask][u]) continue;
    for (auto [v, w] : g[u]) {
      if (dp[mask][v] > dp[mask][u] + w) {
        dp[mask][v] = dp[mask][u] + w;
        pq.emplace(dp[mask][v], v);
      }
    }
  }
}

int main() {
  #define NAME ""
  if (fopen(NAME".inp", "r")) {
    freopen(NAME".inp", "r", stdin);
    freopen(NAME".out", "w", stdout);
  }
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> n >> k >> m;
  debug(k);
  for (int i = 0; i < k; i++) cin >> special[i];
  int u, v, w;
  k--;
  for (int i = 1; i <= m; i++) {
    cin >> u >> v >> w;
    g[u].emplace_back(v, w);
    g[v].emplace_back(u, w);
  }
  memset(dp, 0x3f, sizeof dp);
  for (int i = 0; i < k; i++) {
    dp[1 << i][special[i]] = 0;
  }
  for (int mask = 0; mask < (1 << k); mask++) {
    for (int sub = (mask - 1) & mask; sub; sub = (sub - 1) & mask) {
      for (int i = 1; i <= n; i++) {
        dp[mask][i] = min(dp[mask][i], dp[sub][i] + dp[mask ^ sub][i]);
      }
    }
    dijkstra(mask);
  }
//  debug(special[k], k);
//  for (int i = 1; i <= n; i++) ans = min(ans, dp[(1 << k) - 1][i]);
  cout << dp[(1 << k) - 1][special[k]] << '\n';
  return 0;

}

컴파일 시 표준 에러 (stderr) 메시지

cities.cpp: In function 'int main()':
cities.cpp:42:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   42 |     freopen(NAME".inp", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
cities.cpp:43:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   43 |     freopen(NAME".out", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...