제출 #1291068

#제출 시각아이디문제언어결과실행 시간메모리
1291068Jawad_Akbar_JJCities (BOI16_cities)C++20
100 / 100
1637 ms44040 KiB
#include <iostream>
#include <queue>
#include <vector>

using namespace std;
#define int long long
const int N = 1<<17;
vector<pair<int,int>> nei[N];
int Mn[32][N], sp[5], n, m, k, Ans = 1e17;

void dijkstra(int s, int str){
	priority_queue<pair<int,int>> Q;
	if (s != -1){
		Mn[str][s] = 0;
		Q.push({0, s});
	}
	else{
		for (int i=1;i<=n;i++)
			Q.push({-Mn[str][i], i});
	}

	while (Q.size() > 0){
		auto [mn, u] = Q.top();
		Q.pop();
		mn = -mn;

		if (Mn[str][u] != mn)
			continue;

		for (auto [i, w] : nei[u]){
			if (Mn[str][i] > mn + w){
				Mn[str][i] = mn + w;
				Q.push({-Mn[str][i], i});
			}
		}
	}
}

signed main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cin>>n>>k>>m;

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

	for (int i=1;i<=m;i++){
		int a, b, c;
		cin>>a>>b>>c;

		nei[a].push_back({b, c});
		nei[b].push_back({a, c});
	}

	for (int i=0;i<=n;i++){
		for (int j=1;j<32;j++)
			Mn[j][i] = 1e17;
	}

	for (int i=1, id = 0;i<(1<<k);i++){
		if (__builtin_popcount(i) == 1){
			dijkstra(sp[id++], i);
			continue;
		}

		for (int u=1;u<=n;u++){
			for (auto [v, w] : nei[u])
				for (int msk = i; msk; msk = (msk - 1) & i)
					Mn[i][u] = min(Mn[i][u], Mn[msk][v] + w + Mn[i ^ msk][u]);
		}
		dijkstra(-1, i);
	}
	
	for (int i=1;i<=n;i++)
		Ans = min(Ans, Mn[(1<<k) - 1][i]);

	cout<<Ans<<'\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...