제출 #147331

#제출 시각아이디문제언어결과실행 시간메모리
147331cerberusCities (BOI16_cities)C++17
100 / 100
2890 ms39964 KiB
/* cerberus97 - Hanit Banga */

#include <iostream>
#include <iomanip>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>

using namespace std;

#define pb push_back
#define fast_cin() ios_base::sync_with_stdio(false); cin.tie(NULL)

typedef long long ll;
typedef long double ld;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;

const int N = 1e5 + 10, K = 5, S = (1 << K) + 10;
const ll inf = 1e15 + 42;

int imp[K];
vector<pii> g[N];
ll dp[S][N];

int main() {
	fast_cin();
	int n, k, m;
	cin >> n >> k >> m;
	for (int i = 0; i < k; ++i) {
		cin >> imp[i];
	}
	for (int i = 0; i < m; ++i) {
		int u, v, w;
		cin >> u >> v >> w;
		g[u].pb({v, w});
		g[v].pb({u, w});
	}
	int tot = (1 << k), all = tot - 1;
	for (int mask = 1; mask < tot; ++mask) {
		for (int u = 1; u <= n; ++u) {
			dp[mask][u] = inf;
		}
	}
	for (int i = 0; i < k; ++i) {
		dp[1 << i][imp[i]] = 0;
	}
	for (int mask = 1; mask < tot; ++mask) {
		for (int smask = 0; smask < mask; ++smask) {
			if ((mask & smask) != smask) {
				continue;
			}
			for (int u = 1; u <= n; ++u) {
				dp[mask][u] = min(dp[mask][u], dp[smask][u] + dp[mask ^ smask][u]);
			}
		}
		priority_queue<pll, vector<pll>, greater<pll>> q;
		for (int u = 1; u <= n; ++u) {
			q.push({dp[mask][u], u});
		}
		while (!q.empty()) {
			auto cur = q.top();
			q.pop();
			int u = cur.second;
			if (dp[mask][u] != cur.first) {
				continue;
			}
			for (auto &e : g[u]) {
				int v = e.first, w = e.second;
				ll cand = dp[mask][u] + w;
				if (cand < dp[mask][v]) {
					dp[mask][v] = cand;
					q.push({cand, v});
				}
			}
		}
	}
	ll ans = inf;
	for (int u = 1; u <= n; ++u) {
		ans = min(ans, dp[all][u]);
	}
	cout << ans << endl;
}
#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...