Cod sursa(job #2710510)

Utilizator DragosC1Dragos DragosC1 Data 22 februarie 2021 17:23:51
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
#include <queue>
#include <vector>
#include <iostream>
using namespace std;

#define pair pair<int, int>
#define Inf 1e9

const int kmax = 17;
int n, m, k;
int C[21];
vector<pair> a[2001];
int dp[2001][2001];
int dmin[2001];
int sol[(1 << kmax)][kmax];

void read() {
	int i, x, y, cost;
	ifstream f("ubuntzei.in");
	f >> n >> m;
	f >> k;
	for (i = 1; i <= k; i++)
		f >> C[i];
	for (i = 1; i <= m; i++) {
		f >> x >> y >> cost;
		a[x].emplace_back(make_pair(cost, y));
		a[y].emplace_back(make_pair(cost, x));
	}
	f.close();
	C[0] = 1, C[k + 1] = n;
}

priority_queue<pair, vector<pair>, greater<pair>> Q;

void dijkstra(int x) {
	int i;
	Q.push({0, x});
	dmin[x] = 0;
	while (!Q.empty()) {
		pair x = Q.top();
		Q.pop();
		if (x.first != dmin[x.second]) continue;
		for (i = 0; i < a[x.second].size(); i++) {
			pair cur = a[x.second][i];
			if (dmin[cur.second] > dmin[x.second] + cur.first) {
				dmin[cur.second] = dmin[x.second] + cur.first;
				Q.push({dmin[cur.second], cur.second});
			}
		}
	}
}

void solve() {
	int i, j, mask;
	for (i = 0; i <= k; i++) {
		for (j = 1; j <= n; j++)
			dmin[j] = Inf;
		dijkstra(C[i]);
		for (j = 1; j <= n; j++)
			dp[C[i]][j] = dmin[j];
	}
	for (mask = 0; mask < (1 << (k + 2)); mask++)
		for (i = 0; i <= k + 1; i++)
			sol[mask][i] = Inf;

	sol[1][0] = 0;
	for (mask = 1; mask < (1 << (k + 2)); mask++)
		for (i = 1; i <= k + 1; i++)
			if (mask & (1 << i))
				for (j = 0; j <= k; j++)
					if (i != j && (mask & (1 << j)))
						sol[mask][i] = min(sol[mask][i], sol[mask ^ (1 << i)][j] + dp[C[j]][C[i]]);

}

void output() {
	ofstream g("ubuntzei.out");
	g << sol[(1 << (k + 2)) - 1][k + 1];
	g.close();
}

int main() {
	read();
	solve();
	output();
	return 0;
}