Cod sursa(job #3214367)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 14 martie 2024 08:50:23
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>
int main() {
	using namespace std;
	ifstream fin("hamilton.in");
	ofstream fout("hamilton.out");
	const int kInf = 1e9;
	int n, m;
	fin >> n >> m;
	vector<vector<pair<int, int>>> adj(n);
	vector<pair<int, int>> inv;
	for(int i = 0; i < m; i++) {
		int u, v, c;
		fin >> u >> v >> c;
		adj[u].emplace_back(v, c);
		if(v == 0) {
			inv.emplace_back(u, c);
		}
	}
	int all = (1 << n) - 1;
	auto minSelf = [&](int &x, int y) -> void {
		if(y < x) {
			x = y;
		}
	};
	vector<vector<int>> dp(all + 1, vector<int>(n, kInf));
	dp[1][0] = 0;
	for(int mask = 0; mask <= all; mask++) {
		for(int u = 0; u < n; u++) {
			if(mask >> u & 1) {
				for(const auto &[v, c]: adj[u]) {
					if(!(mask >> v & 1)) {
						minSelf(dp[mask | (1 << v)][v], dp[mask][u] + c);
					}
				}
			}
		}
	}
	int ans = kInf;
	for(const auto &[u, c]: inv) {
		cerr << u << '\n';
		minSelf(ans, dp[all][u] + c);
	}
	if(ans == kInf) {
		fout << "Nu exista solutie";
	} else {
		fout << ans;
	}
	return 0;
}