Cod sursa(job #3215919)

Utilizator PostoacaMateiMatei Postoaca PostoacaMatei Data 15 martie 2024 14:19:45
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
const int inf = 1e9;
const int mod = 1e9 + 7;

int n, m, k;
vii gf[2001];
bool viz[2001];
int dist[2001][2001];
int dp[(1 << 15)][15];
int loc[15];

void dijkstra(int v) {
	for (int i = 1; i <= n; i++)
		dist[v][i] = inf, viz[i] = 0;
	dist[v][v] = 0;
	priority_queue<ii, vii, greater<ii>> pq;
	pq.push({ dist[v][v], v });
	while (!pq.empty()) {
		int vn = pq.top().second;
		pq.pop();
		if (viz[vn])
			continue;
		viz[vn] = 1;
		for (ii i : gf[vn]) {
			int vvc = i.first;
			int vvn = i.second;
			if (!viz[vvn] && dist[v][vvn] > dist[v][vn] + vvc) {
				dist[v][vvn] = dist[v][vn] + vvc;
				pq.push({ dist[v][vvn], vvn });
			}
		}
	}
}

int main() {
	fin >> n >> m >> k;
	for (int i = 0; i < k; i++)
		fin >> loc[i];
	for (int i = 1; i <= m; i++) {
		int x, y, c;
		fin >> x >> y >> c;
		gf[x].push_back({ c, y });
		gf[y].push_back({ c, x });
	}
	dijkstra(1);
	dijkstra(n);
	for (int i = 0; i < k; i++)
		dijkstra(loc[i]);
	if (k == 0) {
		fout << dist[1][n];
		return 0;
	}
	for (int i = 0; i < (1 << k); i++)
		for (int j = 0; j < k; j++)
			dp[i][j] = inf;
	for (int j = 0; j < k; j++)
		dp[(1 << j)][j] = dist[1][loc[j]];
	for (int i = 1; i < (1 << k); i++)
		for (int j = 0; j < k; j++)
			if (((1 << j) & i) != 0) {
				int alt = (i ^ (1 << j));
				for (int a = 0; a < k; a++)
					dp[i][j] = min(dp[i][j], dp[alt][a] + dist[loc[a]][loc[j]]);
			}
	int ans = inf;
	for (int j = 0; j < k; j++)
		ans = min(ans, dp[(1 << k) - 1][j] + dist[loc[j]][n]);
	fout << ans;
	return 0;
}