Cod sursa(job #687576)

Utilizator andreea1coolBobu Andreea andreea1cool Data 22 februarie 2012 16:32:29
Problema Ciclu hamiltonian de cost minim Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include<cstdio>
#include<vector>

int n,m,nod,mask,i,j,x,y,z,mat[20][20],D[20][300000],max=1000000009,k;


int main()
{
	freopen("hamilton.in","r",stdin);
	freopen("hamilton.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		mat[x][y]=z;
	}
	for(i=0;i<n;i++)
		for(j=0;j<(1<<n);j++)
			D[i][j]=10000000;
	D[0][1]=0; 	
	for(mask=1;mask<(1<<n);mask++)
			for(nod=0;nod<n;nod++)
				if(((mask&(1<<nod))!=0))
				for(k=0;k<n;k++)
					if(mat[nod][k]&&((mask&(1<<k))==0))
						if(D[k][mask+(1<<k)]>D[nod][mask]+mat[nod][k])
							D[k][mask+(1<<k)]=D[nod][mask]+mat[nod][k];
						
	for(i=0;i<n;i++)
		if(D[i][((1<<n)-1)]+mat[i][0]<max&&mat[i][0])
			max=D[i][(1<<n)-1]+mat[i][0];
		
	if(max==1000000009)
		printf("Nu exista solutie");
	else
		printf("%d",max);
	return 0;
}