Cod sursa(job #431070)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 31 martie 2010 17:19:37
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
using namespace std;

#include <cstdio>
#include <vector>
#include <fstream>

#define N_MAX (18)
#define mp make_pair
#define oo (1<<30)
#define pb push_back
#define FOR(i,a,b) for(int i = (a);i <= (b);++i)
#define FORit(it,V) for(__typeof((V).begin()) it = (V).begin();it != (V).end();++it)

ifstream fin("hamilton.in");
ofstream fout("hamilton.out");

typedef pair<int,int> pi;
int N,M,K,C[N_MAX][1<<N_MAX];
vector< vector<pi> > A(N_MAX);

int main()
{
	fin >> N >> M;
	
	int x,y,c;
	FOR(i,1,M)
	{
		fin >> x >> y >> c;
		A[x].pb( mp(y,c) );
	}
	K = (1<<N)-1;
	--N;
	
	memset(C,100,sizeof(C));
	C[0][1] = 0;
	
	FOR(k,2,K)
	FOR(i,1,N)
	{
		if(!(k & (1<<i) ))
			continue;
		FORit(it,A[i])
			if(k & (1<<it->first) )
				C[i][k] = min(C[i][k],C[it->first][k ^ (1<<i) ] + it->second);
	}
	
	int rez = oo;
	FORit(it,A[0]) 
		rez = min(rez,C[it->first][K] + it->second);
	if(rez < oo)
		fout << rez << '\n';	
	else
		fout << "Nu exista solutie\n";		
	
	return 0;
}