Cod sursa(job #614551)

Utilizator alexeiIacob Radu alexei Data 6 octombrie 2011 20:08:37
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
#include<vector>
#include<algorithm>

using namespace std;

#define NMAX 20
#define MAXC 1<<NMAX

#define inf 0x3f3f3f3f

int N;
int C[NMAX][NMAX];
int A[MAXC][NMAX];

inline int min( const int a, const int b)
{
	return a<b?a:b;
}

int compute( int path, int node )
{
	if( A[path][node] )
		return A[path][node];
	
	if( path==1+(1<<node) && C[0][node] )
		return C[0][node];

	A[path][node]=inf;

	int i;
	int ans=inf,pw=(1<<node);
	for( i=1; i<N; ++i)
	{
		if( C[i][node] )
		{
			if( (1<<i) & path )
			{
				ans= min( ans, compute( path^pw , i )+ C[i][node] );
				A[path][node]=ans;
			}
		}
	}

	return A[path][node];
}

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

		int M;
		scanf("%d%d",&N,&M);
		
		int i,a1,a2,a3;
		for(i=1; i<=M; ++i)
		{
			scanf("%d%d%d",&a1,&a2,&a3);
			C[a1][a2]=a3; // cost>0
		}
	
		unsigned int ANS=inf,pw=(1<<N)-1;
		for(i=1; i<N; ++i)
		{
			if( C[i][0] )
				ANS=min( ANS, compute( pw, i ) + C[i][0] );
		}
		
		if( ANS!=inf )
			printf("%d\n",ANS);
		else
			printf("Nu exista solutie");

		return 0;
}