Cod sursa(job #1588076)

Utilizator howsiweiHow Si Wei howsiwei Data 2 februarie 2016 19:36:07
Problema Ciclu hamiltonian de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <array>
using namespace std;
const int oo = 1e8;
const int maxn = 18;

array<array<int,maxn-1>,1<<maxn-1> len;

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;
	}
	int N = 1<<n-1;
	for (int i = 0; i < n-1; i++) {
		len[1<<i][i] = adjm[i][n-1];
	}
	for (int M = 1; M < N; M++) {
		for (int M1 = M; M1 != 0; M1 &= M1-1) {
			int i = __builtin_ctz(M1);
			len[M][i] = oo;
			int Mi = M^M1&-M1;
			for (int M2 = Mi; M2 != 0; M2 &= M2-1) {
				int j = __builtin_ctz(M2);
				len[M][i] = min(len[M][i], adjm[i][j]+len[Mi][j]);
			}
		}
	}
	int ans = oo;
	for (int i = 0; i < n-1; i++) {
		ans = min(ans, len[N-1][i]+adjm[n-1][i]);
	}
	if (ans == oo) {
		puts("Nu exista solutie");
	} else {
		printf("%d\n", ans);
	}
}