Pagini recente » Cod sursa (job #456616) | Cod sursa (job #2004410) | Cod sursa (job #2470312) | Cod sursa (job #1373468) | Cod sursa (job #2544883)
#include <iostream>
#include <stdio.h>
#include <vector>
#define NMAX 18
#define INFINIT 1000000000
using namespace std;
struct muchie {
int to ;
int cost ;
};
int mat [ NMAX + 1 ] [ NMAX + 1 ] ;
int d [ 1 << (NMAX+1)] [ NMAX + 1 ] ;
vector <int> g [ NMAX + 1 ] ;
int main() {
FILE *fin, *fout ;
fin = fopen ("hamilton.in", "r" ) ;
fout = fopen ("hamilton.out", "w" ) ;
int n, m, i, u, v, cost, j, minim, mask, nod ;
fscanf (fin, "%d%d", &n, &m ) ;
for (i = 0 ; i < n ; ++i ) {
for (j = 0 ; j < n ; ++j )
mat[i][j] = INFINIT ;
}
for (i = 0 ; i < m ; ++i ) {
fscanf (fin, "%d%d%d", &u, &v, &cost ) ;
mat[u][v] = cost ; /// muchiile invers
g[v].push_back(u) ;
}
for (i = 0 ; i < (1 << n) ; ++i ) {
for (j = 0 ; j < n ; ++j )
d[i][j] = INFINIT ;
}
minim = INFINIT ;
d[1][0] = 0 ;
for (mask = 0 ; mask < 1 << n ; ++mask ) {
for (nod = 0 ; nod < n ; ++nod ) {
for (auto elem : g[nod] ) {
if (mask & (1 << elem)) {
if (!(mask != (1 << nod) + 1 && mat[0][elem] == 0 ) )
d[mask][nod] = std::min(d[mask][nod], d[mask ^ (1 << nod)][elem] + mat[elem][nod]) ;
}
}
}
}
for (auto elem : g[0] )
minim = std::min(minim, d[(1 << n) - 1][elem] + mat[elem][0] ) ;
if (minim == INFINIT )
fprintf (fout, "Nu exista solutie\n" ) ;
else
fprintf (fout, "%d\n", minim ) ;
return 0;
}