Cod sursa(job #432232)

Utilizator bixcabc abc bixc Data 1 aprilie 2010 23:19:54
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define Nmax 18
#define INF 0x3f3f3f3f

int n, m, sol, aux;
int C[Nmax][Nmax], D[1 << Nmax][Nmax];
int V[Nmax][Nmax];

int hamilton (int i, int stare) {
	
	if (D[stare][i] != -1) 
		return D[stare][i];
	
	D[stare][i] = INF;
	for (int j = 1;  j <= V[i][0]; j++) 
		if ( (stare >> V[i][j])&1) {
			if (V[i][j] == 0 && stare != (1 + (1 << i))) 
				continue;
			
			aux = hamilton(V[i][j], stare ^ (1 << i)) + C[V[i][j]][i];
			if (D[stare][i] > aux) D[stare][i] = aux;
		}
	
	return D[stare][i];
}

int main () {

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

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