Pagini recente » Cod sursa (job #502811) | Cod sursa (job #421301) | Cod sursa (job #1886458) | Cod sursa (job #64606) | Cod sursa (job #2712185)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
const int inf = (1<<30)-1;
const int nmax = 18;
const int n2max = (1<<18);
struct str{
int x, y;
};
vector <str> g[nmax];
int d[n2max][nmax];
int main( ) {
int n, m;
fin >> n >> m;
for ( int i = 1; i <= m; ++ i ) {
int x, y, z;
fin >> x >> y >> z;
str aux;
aux.x = y;
aux.y = z;
g[x].push_back(aux);
}
int n2 = (1<<n);
for ( int i = 1; i < n2; ++ i ) {
for ( int j = 0; j < n; ++ j ) {
d[i][j] = inf;
}
}
d[1][0] = 0;
for ( int i = 1; i < n2-1; i += 2 ) {
for ( int j = 0; j < n; ++ j ) {
int j2 = (1<<j);
if ( (i&j2) != 0 ) {
for ( int k = 0; k < int(g[j].size()); ++ k) {
int jn = g[j][k].x;
int jn2 = (1<<jn);
if ( (i&jn2) == 0 ) {
if ( d[i+jn2][jn] > d[i][j]+g[j][k].y ) {
d[i+jn2][jn] = d[i][j]+g[j][k].y;
}
}
}
}
}
}
int sol = inf;
for ( int i = 0; i < n; ++ i ) {
for ( int j = 0; j < int(g[i].size()); ++ j ) {
if ( g[i][j].x == 0 ) {
if ( sol > d[n2-1][i]+g[i][j].y ) {
sol = d[n2-1][i]+g[i][j].y;
}
}
}
}
if ( sol != inf ) {
fout << sol << "\n";
} else {
fout << "Nu exista solutie";
}
return 0;
}