Cod sursa(job #3247234)

Utilizator Luca07Nicolae Luca Luca07 Data 6 octombrie 2024 14:08:44
Problema Ciclu hamiltonian de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
#include<vector>
using namespace std;

#define ll long long

ifstream cin("hamilton.in");
ofstream cout("hamilton.out");

vector<vector<ll>> dp;
vector<vector<pair<ll, ll>>> graph;
vector<vector<pair<ll, ll>>> rgraph;

int main() {
	ll i, j, nr, n, m, u, v, c, pw;

	cin >> n >> m;

	pw = (1 << n);
	dp = vector<vector<ll>>(pw + 1, vector<ll>(n, INT64_MAX));
	dp[1] = vector<ll>(n, 0);
	graph.resize(n);
	rgraph.resize(n);

	for (i = 0; i < m; i++) {
		cin >> u >> v >> c;
		graph[u].push_back({ v,c });
		rgraph[v].push_back({ u,c });
	}

	for (ll p = 1; p < pw; p++) {
		for (i = 0; i < n; i++) {
			if (p & (1 << i)&& dp[p][i]!= INT64_MAX) {
				for (auto v : graph[i]) {
					if (!(p & (1 << v.first)) && dp[p][i] + v.second < dp[(p | (1 << v.first))][v.first]) {
						dp[(p | (1 << v.first))][v.first] = dp[p][i] + v.second;
					}
				}
			}
		}
	}

	ll res = INT64_MAX;

	for (auto v : rgraph[0]) {
		if (dp[pw - 1][v.first] != INT64_MAX) {
			res = min(res, dp[pw - 1][v.first] + v.second);
		}
	}

	cout << res;

	return 0;
}