Pagini recente » Cod sursa (job #2140710) | Cod sursa (job #3140861) | Cod sursa (job #515373) | Cod sursa (job #1338722) | Cod sursa (job #614551)
Cod sursa(job #614551)
#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;
}