Cod sursa(job #586863)

Utilizator drywaterLazar Vlad drywater Data 3 mai 2011 09:01:35
Problema Ciclu hamiltonian de cost minim Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <stdio.h>
int x,y,z,j,k,n,m,dp[(1<<19)][19],i,min;
int a[19][19];
int main(void)
{
	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);
		a[x][y]=z;
	}
	for (j=1;j<(1<<n);j++)
	{
		for (i=0;i<n;i++)
		{
			dp[j][i]=1000000000;
		}
	}
	dp[1][0]=0;
	for (j=1;j<(1<<n);j++)
	{
		for (i=0;i<n;i++)
		{
			if (!(j&(1<<i))) continue;
			for (k=0;k<n;k++)
			{
				if (!(j&(1<<k)) || k==i) continue;
				if (!a[k][i]) continue;
				if (dp[j][i]>dp[j^(1<<i)][k]+a[k][i]) dp[j][i]=dp[j^(1<<i)][k]+a[k][i];
			}
		}
	}
	min=1000000000;
	for (i=1;i<n;i++)
		if (min>dp[(1<<n)-1][i]+a[i][0] && a[i][0]) min=dp[(1<<n)-1][i]+a[i][0];
	printf("%d\n",min);
	return 0;
}