Submission #1282851

#TimeUsernameProblemLanguageResultExecution timeMemory
1282851behradCities (BOI16_cities)C++17
100 / 100
2867 ms142696 KiB
#include <bits/stdc++.h>
using namespace std;
// * No One Dies a Virgin, Life Fucks Us All
typedef long long ll;
#define nl '\n'
#define ff first
#define ss second
#define pb push_back
#define sik(x) {cout << x << nl; return;}
constexpr ll maxn = 1e5+5, mod = 1e9 + 7, inf = 2e15, SQ = 450, LG = 20;
typedef pair<ll, ll> pii;

#pragma GCC optimize("O3")
#pragma GCC target("sse4.2,tune=native")

int n, m, k, spc[7];
ll W[7][maxn], dis[maxn][32];
vector<pii> g[maxn];

inline void djk(int s, ll* dis) {
  for (int i = 1 ; i <= n ; i ++) dis[i] = inf;
  dis[s] = 0;
  priority_queue<pii, vector<pii>, greater<pii>> q;
  q.push({0, s});
  while (q.size()) {
    auto [d, v] = q.top(); q.pop();
    if (d > dis[v]) continue;
    for (auto [u, w] : g[v]) {
      if (dis[u] > dis[v] + w) {
        dis[u] = dis[v] + w;
        q.push({dis[u], u});
      }
    }
  }
}

int32_t main() {
  cin.tie(0)->sync_with_stdio(0); 
  cin >> n >> k >> m;
  for (int i = 0 ; i < k ; i ++) cin >> spc[i];
  for (int i = 1 , u , v , w ; i <= m ; i ++) {
    cin >> u >> v >> w;
    g[u].pb({v, w});
    g[v].pb({u, w});
  }
  
  #pragma GCC ivdep
  for (int i = 0 ; i < k ; i ++) {
    djk(spc[i], W[i]);
  }

  priority_queue<array<ll, 3>, vector<array<ll, 3>>, greater<array<ll, 3>>> q; // {dis, v, msk}
  for (int i = 1 ; i <= n ; i ++) {
    fill(dis[i], dis[i] + 32, inf);
    dis[i][0] = 0;
    q.push({0, i, 0});
  }

  while (q.size()) {
    auto [d, v, msk] = q.top(); q.pop();
    if (d > dis[v][msk]) continue;
    #pragma GCC ivdep
    for (auto [u, w] : g[v]) {
      if (dis[u][msk] > dis[v][msk] + w) {
        dis[u][msk] = dis[v][msk] + w;
        q.push({dis[u][msk], u, msk});
      }
    }
    #pragma GCC ivdep
    for (int i = 0 ; i < k ; i ++) {
      if (~msk >> i & 1) {
        int msk2 = msk | (1 << i);
        if (dis[v][msk2] > dis[v][msk] + W[i][v]) {
          dis[v][msk2] = dis[v][msk] + W[i][v];
          q.push({dis[v][msk2], v, msk2});
        }
      }
    }
  }

  ll ans = inf;
  for (int i = 1 ; i <= n ; i ++) ans = min(ans, dis[i][(1 << k) - 1]);
  cout << ans << nl;
}
#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...