Cod sursa(job #432203)

Utilizator bixcabc abc bixc Data 1 aprilie 2010 22:48:27
Problema Ciclu hamiltonian de cost minim Scor 75
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

#define Nmax 18
#define INF 0x3f3f3f3f

int n, m, sol;
int C[Nmax][Nmax], D[Nmax][(1 << Nmax) + 2];
vector <int> V[Nmax];

int hamilton (int i, int stare) {
	
	if (D[i][stare] != -1) 
		return D[i][stare];
	
	D[i][stare] = INF;
	for (vector <int>::iterator it = V[i].begin ();  it != V[i].end (); it++) 
		if ( (stare >> *it)&1 )
			D[i][stare] = min (D[i][stare], hamilton(*it, stare ^ (1 << i)) + C[*it][i]);
	
	return D[i][stare];
}

int main () {

	freopen ("hamilton.in", "r", stdin);
	freopen ("hamilton.out", "w", stdout);

	int i, x, y, z;
	
	scanf ("%d %d", &n, &m);
	for (i = 0; i < n; i++) {
		memset (D[i], -1, sizeof (D[i]));
		memset (C[i], INF, sizeof (C[i]));
	}
	
	for (i = 1; i <= m; i++) {
		scanf ("%d %d %d", &x, &y, &z);
		V[y].push_back (x);
		C[x][y] = z;
	}	
	
	D[0][1] = 0;
	
	sol = INF;
	for (i = 0; i < n; i++)
		if (C[i][0] != INF) 
			sol = min (sol, hamilton (i, (1 << n) - 1 ) + C[i][0] );
	
	if (sol != INF) printf ("%d", sol);
	else printf ("Nu exista solutie");
	
	return 0;
}