Cod sursa(job #526918)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 29 ianuarie 2011 19:56:38
Problema Ciclu hamiltonian de cost minim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

#define file_in "hamilton.in"
#define file_out "hamilton.out"

#define nmax 20

int N,M;
int a,b,c;
int C[nmax][nmax];
int D[1<<nmax][nmax];
vector<int> G[nmax];
int ans;
int i,j,k;

int main(){
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
    scanf("%d %d", &N, &M);
	for (i=1;i<=M;++i){
		
		scanf("%d %d %d", &a, &b, &c);
		
		G[b].push_back(a);
		C[a][b]=c;
	}
	
	for (i=0;i<(1<<N);++i) 
		 for (j=0;j<N;++j)
			  D[i][j]=0x3f3f3f3f;
	D[1][0]=0;
	
	for (i=0;i<(1<<N);++i)
		 for (j=0;j<N;++j) 
			  if (i&(1<<j))
				  for (k=0;k<G[j].size();++k)
					   if (i&(1<<G[j][k]))
						    D[i][j]=min(D[i][j],D[i^(1<<j)][G[j][k]]+C[G[j][k]][j]);
					   
	ans=0x3f3f3f3f;

	for (i=0;i<G[0].size();++i)
		 ans=min(ans,D[(1<<N)-1][G[0][i]]+C[G[0][i]][i]);
	if (ans==0x3f3f3f3f)
		 printf("Nu exista solutie\n");
	else
		printf("%d\n", ans);
	
	return 0;
	
}