Cod sursa(job #1557255)

Utilizator howsiweiHow Si Wei howsiwei Data 27 decembrie 2015 06:40:20
Problema Ciclu hamiltonian de cost minim Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int oo = 1e8;

int main() {
	freopen("hamilton.in", "r", stdin);
	freopen("hamilton.out", "w", stdout);
	int n, m;
	cin >> n >> m;
	vector<vector<int>> adjm(n, vector<int>(n, oo));
	for (int i = 0; i < m; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		adjm[u][v] = w;
	}
	vector<vector<int>> lenpath(1<<n-1, vector<int>(n-1, oo));
	for (int i = 0; i < n-1; i++) {
		lenpath[1<<i][i] = adjm[i][n-1];
	}
	for (int mask = 1; mask < 1<<n-1; mask++) {
		for (int mask1 = mask; mask1 != 0; mask1 &= mask1-1) {
			int i = __builtin_ctz(mask1);
			for (int mask2 = mask^1<<i; mask2 != 0; mask2 &= mask2-1) {
				int j = __builtin_ctz(mask2);
				lenpath[mask][i] = min(lenpath[mask][i],
						lenpath[mask^1<<i][j]+adjm[i][j]);
			}
		}
	}
	int ans = oo;
	for (int i = 0; i < n-1; i++) {
		ans = min(ans, lenpath[(1<<n-1)-1][i]+adjm[n-1][i]);
	}
	printf("%d\n", ans);
}