Cod sursa(job #3216407)

Utilizator vladdobro07vladdd vladdobro07 Data 16 martie 2024 23:26:59
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.77 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 + 7979, maskmax = (1 << (kmax + 2));

vector<pii> g[nmax + 1], gmic[kmax + 2];
vector<int> ubu(kmax + 2), minn(nmax + 1, inf);
vector<bool> ped(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);
	ped = vector<bool>(nmax + 1, 0);

        priority_queue<pii, vector<pii>, greater<pii>> pq;
	pq.push({0, ubu[start]});
	minn[ubu[start]] = 0;

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

		if(cur_cost > minn[cur_nod])
			continue;

		for(auto [n_nod, n_cost] : g[cur_nod]) {

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

	for(int i = 0; i < k; i++) {
		if(i == start)
			continue;
		else
			gmic[start].push_back({i, 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];

				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() {
//	for(int i = 0; i < k; i++)
//		cout << ubu[i] << " ";
//	cout << "\n\n";
//	for(int mask = 0; mask < (1 << (k)); mask++){
//		for(int i = 0; i < k; i++)
//                        cout<<mask<<" "<<i<<" "<<dp[mask][i]<<"\n";
//                cout<<"\n";
//	}
//	for(int i=0;i<k;i++){
//                cout<<i<<"("<<ubu[i]<<")"<<":\n";
//                for(auto a:gmic[i])
//                        cout<<a.first<<"("<<ubu[a.first]<<") "<<a.second<<"\n";
//	}

        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;
}