Pagini recente » Cod sursa (job #478476) | Cod sursa (job #3247326) | Cod sursa (job #66195) | Cod sursa (job #1406972) | Cod sursa (job #1758209)
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
#define NMAX 19
#define MMAX 263000
#define INFI 0x3f3f3f3f
vector < int > g[ NMAX ];
int v[ MMAX ][ NMAX ],
cost[ NMAX ][ NMAX ];
int compute( int reprezentareBinara, int nod ){
vector < int > :: iterator it;
if( v[ reprezentareBinara ][ nod ] == INFI ){ /// necalculat inca
for( it = g[ nod ].begin(); it != g[ nod ].end(); ++it ){
if( reprezentareBinara & ( 1 << ( *it ) ) ){ /// daca apartine sir
if( *it == 0 && reprezentareBinara != ( 1 << nod ) + 1 ) continue ; /// daca umeaza nodul de start si este ultimul de adaugat
v[ reprezentareBinara ][ nod ] = min( v[ reprezentareBinara ][ nod ], compute( reprezentareBinara ^ ( 1 << nod ), *it ) + cost[ *it ][ nod ] ); /// eliminam nod curent, si calculam pentru vecini
}
}
}
return v[ reprezentareBinara ][ nod ];
}
int main()
{
freopen("hamilton.in","r",stdin);
freopen("hamilton.out","w",stdout);
int n, m, i, j, x, y, sol;
scanf("%d%d",&n,&m);
while( m-- ){
scanf("%d%d",&x,&y);
scanf("%d",&cost[ x ][ y ]);
g[ y ].push_back( x );
}
for( i = 0; i < ( 1 << n ); ++i )
for( j = 0; j < n; ++j ) v[ i ][ j ] = INFI;
for( j = 0; j < n; ++j ) v[ 1 ][ j ] = 0;
sol = INFI;
for( i = 0; i < g[ 0 ].size(); ++i )
sol = min( sol, compute( ( 1 << n ) - 1, g[ 0 ][ i ] ) + cost[ g[ 0 ][ i ] ][ 0 ] );
if( sol != INFI ) printf("%d\n",sol);
else printf("-1");
return 0;
}