Pagini recente » Cod sursa (job #1164880) | Cod sursa (job #1923921) | Cod sursa (job #2478731) | Cod sursa (job #215971) | Cod sursa (job #823026)
Cod sursa(job #823026)
#include<cstdio>
#include<vector>
#include<string.h>
using namespace std;
#define INF 100000000
#define NMAX 20
#define MAX 262150
int n,m,cst,x,y ;
int cost[NMAX][NMAX],vizcost[MAX][NMAX],REZ;
vector< int > g[NMAX];
inline int min (int a , int b )
{
return a < b ? a : b ;
}
void hamilton_r()
{
for(int i=0 ; i<(1<<n) ; ++i)
for( int j = 0 ; j < n ; ++j )
vizcost[i][j]=INF;
vizcost[1][0]=0;
for(int i=0 ; i<(1<<n) ; ++i)
for( int j = 0 ; j < n ; ++j )
if( i&(1<<j) )
for(int k = 0 ; k < g[j].size() ; ++k )
if( i&(1<<g[j][k]) )
vizcost[i][j] = min ( vizcost[i][j], vizcost[(i^(1<<j))][g[j][k]] + cost[g[ j ][ k ]][ j ]) ;
for(int i=0 ;i< g[0].size();++i)
REZ = min ( REZ , vizcost[(1<<n)-1][g[0][i]] +cost[g[0][i]][0] );
}
void citeste()
{
scanf("%d %d",&n,&m);
for(int i = 0 ;i<n ; ++i )
for(int j = 0 ; j < n ; ++j) cost[i][j] = INF;
for(int i=1 ; i<= m; ++i)
{
scanf("%d %d %d",&x,&y,&cst);
g[y].push_back(x);
cost[x][y]= cst ;
}
REZ= INF ;
}
int main()
{
freopen("hamilton.in","r",stdin);
freopen("hamilton.out","w",stdout);
citeste();
hamilton_r();
if(REZ != INF) printf("%d\n",REZ);
else printf("Nu exista solutie\n");
return 0;
}