Submission #1326060

#TimeUsernameProblemLanguageResultExecution timeMemory
1326060nhq0914Cities (BOI16_cities)C++20
100 / 100
1444 ms45800 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;

	// using T = tuple <long long, int, int>;
	// T a = {0, 1, 2}, b = {2, 1, 0};
	// cout << (a < b) << '\n';

	// for(int i = 0; i < k + 2; ++i) cout << important[i] << ' ';
	// cout << '\n';
	for(int i = 0; i < k; ++i){
		// cout << i << ' ' << important[i] << '\n';
		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);
		}
	}

	// for(int i = 1; i <= n; ++i)
	// 	cout << "dis0 " << i << ' ' << dis0[i][1] << '\n';

	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;
		// cout << d << ' ' << s << ' ' << v << '\n';
		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;
			// if(d == 0 && s == 0 && v == 3) cout << "mask " << mask << ' ' << d << ' ' << dis0[v][mask] << '\n';
			q.emplace(dis1[v][s | mask] = d + dis0[v][mask], s | mask, v);
		}
	}

	// cout << important[k + 1] << '\n';
	cout << dis1[important[k + 1]][(1 << k) - 1];

	cerr << "ok\n";
}
#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...