Submission #1326063

#TimeUsernameProblemLanguageResultExecution timeMemory
1326063nhq0914Cities (BOI16_cities)C++20
100 / 100
1161 ms45840 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 7;
const long long inf = 1e15;

int n, k, m;
int important[5];

vector <pair <int, int>> adj[maxn];

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	cin >> n >> k >> m;

	for(int i = 0; i < k; ++i) cin >> important[i];

	for(int a, b, c; m--;) {
		cin >> a >> b >> c;
		adj[a].emplace_back(b, c);
		adj[b].emplace_back(a, c);
	}

	if(k == 2) {
		vector <long long> d(n + 1, inf);
		priority_queue <pair <long long, int>, vector <pair <long long, int>>, greater <pair <long long, int>>> q;

		int &s = important[0];
		int &t = important[1];

		q.emplace(d[s] = 0, s);
		while(!q.empty()) {
			auto[c, v] = q.top(); q.pop();
			if(c > d[v]) continue;
			for(auto &[x, w]: adj[v]) {
				if(d[x] <= c + w) continue;
				q.emplace(d[x] = c + w, x);
			}
		}

		cout << d[t];
		return 0;
	}

	k -= 2;

	vector <vector <long long>> dis0(n + 1, vector <long long> (1 << k, inf));
	vector <vector <long long>> dis1(n + 1, vector <long long> (1 << k, inf));
	priority_queue <tuple <long long, int, int>, vector <tuple <long long, int, int>>, greater <tuple <long long, int, int>>> q;

	for(int i = 0; i < k; ++i)
		q.emplace(dis0[important[i]][1 << i] = 0, 1 << i, important[i]);
	while(!q.empty()) {
		auto [d, s, v] = q.top(); q.pop();
		if(d > dis0[v][s]) continue;
		for(auto &[x, w]: adj[v]) if(dis0[x][s] > d + w) {
			q.emplace(dis0[x][s] = d + w, s, x);
		}
		for(int mask = (1 << k) - 1 - s; mask; mask &= --mask){
			if(dis0[v][s | mask] <= d + dis0[v][mask]) continue;
			q.emplace(dis0[v][s | mask] = d + dis0[v][mask], s | mask, v);
		}
	}

	q.emplace(dis1[important[k]][0] = 0, 0, important[k]);
	while(!q.empty()) {
		auto [d, s, v] = q.top(); q.pop();
		if(d > dis1[v][s]) continue;
		for(auto &[x, w]: adj[v]) if(dis1[x][s] > d + w) {
			q.emplace(dis1[x][s] = d + w, s, x);
		}
		for(int mask = (1 << k) - 1 - s; mask; mask &= --mask){
			if(dis1[v][s | mask] <= d + dis0[v][mask]) continue;
			q.emplace(dis1[v][s | mask] = d + dis0[v][mask], s | mask, v);
		}
	}

	cout << dis1[important[k + 1]][(1 << k) - 1];
}
#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...