Pagini recente » Cod sursa (job #686308) | Cod sursa (job #3219829) | Cod sursa (job #934580) | Cod sursa (job #1159106) | Cod sursa (job #1936416)
#include <cstdio>
#include <vector>
#include <algorithm>
#define MAXN 18
#define INF 0x3f3f3f3f
using namespace std;
vector <int> G[MAXN];
int n, m, d[(1<<MAXN)][MAXN], cost[MAXN][MAXN];
bool seen[(1<<MAXN)][MAXN];
int solve(int mask, int node)
{
if(seen[mask][node])
return d[mask][node];
int i, son;
for(i=0; i<G[node].size(); ++i) {
son = G[node][i];
if(mask & (1<<son))
d[mask][node] = min(d[mask][node], cost[son][node] + solve(mask - (1<<node), son));
}
return d[mask][node];
}
int main()
{
freopen("hamilton.in", "r", stdin);
freopen("hamilton.out", "w", stdout);
int i, j, x, y, z;
scanf("%d%d", &n, &m);
for(i=0; i<n; ++i)
for(j=0; j<n; ++j) {
cost[i][j] = INF;
seen[(1<<j)][j] = 1;
}
for(i=0; i<(1<<n); ++i)
for(j=0; j<n; ++j)
d[i][j] = INF;
for(i=1; i<=m; ++i) {
scanf("%d%d%d", &x, &y, &z);
G[y].push_back(x);
cost[x][y] = z;
}
d[1][0] = 0;
seen[1][0] = 1;
for(i=1; i<(1<<n); ++i)
if(i&1)
for(j=1; j<n; ++j)
if(i & (1<<j))
d[i][j] = solve(i, j);
int answer = INF;
for(i=1; i<n; ++i)
if(cost[i][0] != INF)
answer = min(answer, d[(1<<n)-1][i] + cost[i][0]);
if(answer == INF)
printf("Nu exista solutie");
else printf("%d", answer);
return 0;
}