Pagini recente » Cod sursa (job #2803855) | Cod sursa (job #929834) | Cod sursa (job #696686) | Cod sursa (job #2192335) | Cod sursa (job #1232769)
#include <cstdio>
#include <iostream>
using namespace std;
int n,m,x,y,c,C[18][18],sol[18][1<<18],i,N,mask,j,ans;
int main()
{
freopen("hamilton.in","r",stdin);
freopen("hamilton.out","w",stdout);
scanf("%d%d",&n,&m);
for(;m;m--)
{
scanf("%d%d%d",&x,&y,&c);
C[x][y]=c;
}
for(i=0;i<n-1;i++)
sol[i][(1<<i)]=C[n-1][i];
N=(1<<(n-1))-1;
for(mask=1;mask<=N;mask++)
for(i=0;i<n-1;i++)
{
if(sol[i][mask])
{
for(j=0;j<n-1;j++)
{
if(!(mask&(1<<j))&&C[i][j])
{
if(sol[j][mask|(1<<j)])
sol[j][mask|(1<<j)]=min(sol[j][mask|(1<<j)],C[i][j]+sol[i][mask]);
else
sol[j][mask|(1<<j)]=C[i][j]+sol[i][mask];
}
}
}
}
ans=18000010;
for(i=0;i<n-1;i++)
if(sol[i][N]&&C[i][n-1])
ans=min(ans,(sol[i][N]+C[i][n-1]));
printf("%d\n",ans);
return 0;
}