Cod sursa(job #2717050)

Utilizator StefanSanStanescu Stefan StefanSan Data 6 martie 2021 11:10:26
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include      <iostream>
#include      <fstream>
#include      <queue>
#include      <vector>

using namespace std;

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

const int oo = 2e9;

int n, m, k, c[20], d[2005], dist[20][20], dp[(1 << 18) + 5][18];
bool inCoada[2005];

struct compara {
	bool operator()(int a, int b) {
		return d[a] > d[b];
	}
};

vector < pair < int, int > > G[2005];
priority_queue< int, vector < int >, compara > Q;

void dijkstra(int nod) {
	for (int i = 1; i <= n; i++)d[i] = oo;
	d[nod] = 0;
	Q.push(nod);
	inCoada[nod] = true;

	while (!Q.empty()) {
		int nod_curent = Q.top();
		Q.pop();
		inCoada[nod_curent] = false;

		for (unsigned int i = 0; i < G[nod_curent].size(); i++) {
			int vecin = G[nod_curent][i].first;
			int cost = G[nod_curent][i].second;

			if (d[vecin] > d[nod_curent] + cost) {
				d[vecin] = d[nod_curent] + cost;
				if (inCoada[vecin] == false) {
					inCoada[vecin] = true;
					Q.push(vecin);
				}
			}

		}

	}

}


int main() {

	ios::sync_with_stdio(false);
	in.tie(NULL), out.tie(NULL);

	in >> n >> m >> k;
	for (int i = 1; i <= k; i++) in >> c[i];
	for (int i = 1; i <= m; i++) {
		int x, y, c;
		in >> x >> y >> c;
		G[x].push_back(make_pair(y, c));
		G[y].push_back(make_pair(x, c));
	}

	c[0] = 1, c[k + 1] = n;

	for (int i = 0; i <= k + 1; i++) {
		dijkstra(c[i]);
		for (int j = 0; j <= k + 1; j++) dist[i][j] = d[c[j]];
		if (i) dist[i][i] = 5000000;
	}

	int doilakplus2 = (1 << (k + 2));

	for (int i = 0; i < doilakplus2; i++) {
		for (int j = 0; j <= k + 1; j++) {
			dp[i][j] = 5000000;
		}
	}

	dp[0][0] = 0;

	for (int i = 0; i < doilakplus2; i++) {
		for (int j = 0; j <= k + 1; j++) {
			if (i & (1 << j)) {
				for (int l = 0; l <= k + 1; l++) {
					dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][l] + dist[l][j]);
				}
			}
		}
	}

	out << dp[(1 << k + 2) - 1][k + 1];

	return 0;
}