Cod sursa(job #3212156)

Utilizator vladdobro07vladdd vladdobro07 Data 11 martie 2024 10:58:16
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <bits/stdc++.h>
#define pii pair<int,int>

using namespace std;

// Skibidi Pula Skibidi Pula Skibidi Pula Skibidi Pula Skibidi Pula Skibidi Pula Skibidi Pula
//(cred ca innebunesc ajutor ajuta ti ma va rog nu mai suport)

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

const int nmax = 2e3, kmax = 15, inf = 1e9 + 79, maskmax = (1 << (kmax + 2));

priority_queue<pii, vector<pii>, greater<pii>> pq;
vector<pii> g[nmax + 1], gmic[kmax + 2];
vector<int> ubu(kmax + 2), minn(nmax + 1, inf);
vector<bool> viz(nmax + 1, 0);

int dp[maskmax][kmax + 2];
int n, m, k, x, y, ct;

void read() {
	fin >> n >> m >> k;

	ubu[0] = 1;
	for(int i = 1; i <= k; i++) {
		fin >> x;
		ubu[i] = x;
	}
	ubu[k + 1] = n;

	for(int i = 1; i <= m; i++) {
		fin >> x >> y >> ct;
		g[x].push_back({y, ct});
		g[y].push_back({x, ct});
	}

	k += 2;
}

void make_djikstra(int start) {
	minn = vector<int>(nmax + 1, inf);
	viz = vector<bool>(nmax + 1, 0);

	pq.push({0, ubu[start]});
	minn[ubu[start]] = 0;

	while(!pq.empty()) {
		int cur_nod = pq.top().second, cur_cost = minn[cur_nod];
		pq.pop();

		if(viz[cur_nod] == 1)
			continue;
		viz[cur_nod] = 1;

		for(auto muchie : g[cur_nod]) {
			int n_nod = muchie.first, n_cost = cur_cost + muchie.second;

			if(minn[n_nod] > n_cost) {
				pq.push({n_cost, n_nod});
				minn[n_nod] = n_cost;
			}
		}
	}

	for(int i = 0; i < ubu.size(); i++) {
		if(i == start)
			continue;
		else
			gmic[start].push_back({i, minn[ubu[i]]});
		gmic[i].push_back({start, minn[ubu[i]]});
	}
}

void make_smol_graph() {
	for(int i = 0; i < k; i++)
		make_djikstra(i);
}

void hamilton() {
	for(int i = 0; i < k; i++)
		for(int mask = 0; mask < (1 << (k)); mask++)
			dp[mask][i] = inf;
	dp[1][0] = 0;

	for(int mask = 1; mask < (1 << (k)); mask++) {
		for(int ubuntzel = 0; ubuntzel < k; ubuntzel++) {
			if(((1 << ubuntzel) & mask)) {
				int cost = dp[mask][ubuntzel], nnode, ncost;

				for(auto [nnode, ncost] : gmic[ubuntzel]) {
					if(!((1 << nnode) & mask))
						dp[(mask | (1 << nnode))][nnode] = min(dp[(mask | (1 << nnode))][nnode], cost + ncost);
				}
			}
		}
	}
}

void print() {
	int rez = inf, allmask = (1 << (k)) - 1;

	for(int i = 0; i < k; i++)
		rez = min(rez, dp[allmask][i]);

	fout << rez << "\n";
}

int main() {
	read();
	make_smol_graph();
	hamilton();
	print();
	return 0;
}