제출 #202406

#제출 시각아이디문제언어결과실행 시간메모리
202406quocnguyen1012Cities (BOI16_cities)C++14
100 / 100
3145 ms70304 KiB
#include <bits/stdc++.h>

#define fi first
#define se second
#define mp make_pair
#define pb push_back

using namespace std;
typedef long long ll;

const int maxn = 2e5 + 5;
const ll llinf = 1e18;

int N, K, M;
vector<int> imp;
int U[maxn], V[maxn], W[maxn];
ll f[1 << 5][maxn];
vector<int> adj[maxn];
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;

signed main(void)
{
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  if (fopen("A.INP", "r")){
    freopen("A.INP", "r", stdin);
    freopen("A.OUT", "w", stdout);
  }
  cin >> N >> K >> M;
  imp.assign(K, 0);
  for (auto & x : imp){
    cin >> x;
  }
  for (int i = 1; i <= M; ++i){
    cin >> U[i] >> V[i] >> W[i];
    adj[U[i]].pb(i); adj[V[i]].pb(i);
  }
  fill_n(&f[0][0], (1 << 5) * maxn, llinf);
  for (int i = 0; i < K; ++i){
    f[1 << i][imp[i]] = 0;
  }
  for (int mask = 1; mask < (1 << K); ++mask){
    for (int a = mask; a; a = (a - 1) & mask){
      for (int i = 1; i <= N; ++i){
        f[mask][i] = min(f[mask][i], f[mask ^ a][i] + f[a][i]);
      }
    }
    for (int i = 1; i <= N; ++i){
      if (f[mask][i] != llinf){
        pq.push(mp(f[mask][i], i));
      }
    }
    while (pq.size()){
      auto now = pq.top(); pq.pop();
      if (f[mask][now.se] != now.fi) continue;
      for (int i : adj[now.se]){
        int v = U[i] + V[i] - now.se;
        if (f[mask][v] > now.fi + W[i]){
          f[mask][v] = now.fi + W[i];
          pq.push(mp(f[mask][v], v));
        }
      }
    }
  }
  ll res = llinf;
  for (int i = 1; i <= N; ++i){
    res = min(res, f[(1 << K) - 1][i]);
  }
  cout << res << '\n';
}

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

cities.cpp: In function 'int main()':
cities.cpp:25:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     freopen("A.INP", "r", stdin);
     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
cities.cpp:26:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     freopen("A.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...