Pagini recente » Cod sursa (job #1647189) | Cod sursa (job #2695226) | Cod sursa (job #1982213) | Cod sursa (job #272070) | Cod sursa (job #743295)
Cod sursa(job #743295)
#include<stdio.h>
#define INF (1<<29)
FILE*f=fopen("hamilton.in","r");
FILE*g=fopen("hamilton.out","w");
int n,m;
int D[18][1<<18],G[18][18],C[18][1<<18];
inline int min ( const int &a , const int &b ){
return a <= b ? a : b;
}
int solve ( int nod , int conf ){
if ( D[nod][conf] != INF ){
return D[nod][conf];
}
--D[nod][conf];
for ( int i = 1 ; i <= G[nod][0] ; ++i ){
int last = G[nod][i];
if ( conf & (1<<last) )
D[nod][conf] = min(D[nod][conf],solve(last,conf^(1<<nod))+C[last][nod]);
}
return D[nod][conf];
}
int main () {
fscanf(f,"%d %d",&n,&m);
int x,y,c;
for ( int i = 1 ; i <= m ; ++i ){
fscanf(f,"%d %d %d",&x,&y,&c);
G[y][++G[y][0]] = x;
C[x][y] = c;
}
for ( int i = 0 ; i < n ; ++i ){
for ( int j = 0 ; j < (1<<n) ; ++j ){
D[i][j] = INF;
}
}
D[0][1] = 0;
int sol = INF;
for ( int i = 1 ; i <= G[0][0] ; ++i ){
int last = G[0][i];
sol = min(sol,solve(last,(1<<n)-1)+C[last][0]);
}
if ( sol == INF )
fprintf(g,"Nu exista solutie\n");
else
fprintf(g,"%d\n",sol);
fclose(f);
fclose(g);
return 0;
}