Pagini recente » Borderou de evaluare (job #2680376) | Borderou de evaluare (job #301899) | Borderou de evaluare (job #2287208) | Borderou de evaluare (job #774224) | Cod sursa (job #1800982)
#include <bits/stdc++.h>
using namespace std;
int N, M, B;
int c[25][25];
int dp[300005][20];
int p2[300005];
vector <int> edg[25];
int main()
{
freopen("hamilton.in", "r", stdin);
freopen("hamilton.out", "w", stdout);
scanf("%d%d", &N, &M);
for(int i = 1; i <= M; i++)
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
c[x][y] = z;
edg[y].push_back(x);
}
for(int i = 2; i < (1 << N); i++)
{
p2[i] = p2[i - 1];
if( (2 << p2[i]) == i )
p2[i]++;
}
dp[1][0] = 1;
for(int msk = 2; msk < (1 << N); msk++)
{
if( (msk & (msk - 1)) == 0 ) continue;
int m = msk;
while(m)
{
int lst = p2[m];
m -= (1 << lst);
dp[msk][lst] = 1 << 30;
for(auto x: edg[lst])
if( msk & (1 << x) )
{
if(dp[msk ^ (1 << lst)][x])
dp[msk][lst] = min(dp[msk][lst], dp[msk ^ (1 << lst)][x] + c[x][lst]);
}
if(dp[msk][lst] == (1 << 30))
dp[msk][lst] = 0;
}
}
int ans = 1 << 30;
for(int i = 1; i < N; i++)
if(dp[(1 << N) - 1][i] && c[i][0])
ans = min(ans, dp[(1 << N) - 1][i] + c[i][0]);
if(ans == (1 << 30))
{
printf("Nu exista solutie\n");
return 0;
}
printf("%d\n", ans - 1);
return 0;
}