Pagini recente » Cod sursa (job #1540695) | Cod sursa (job #1822264) | Cod sursa (job #3328) | Cod sursa (job #3219348) | Cod sursa (job #3249996)
#include <bits/stdc++.h>
#define NMAX 300100
#define MM 22
#define MOD 1000050000
using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
int dp[NMAX][MM], cost[MM][MM], n, m;
vector<int>v[MM];
int hamilton(int mask, int node)
{
if(dp[mask][node]==-1)
{
dp[mask][node]=MOD;
for(auto i:v[node])
if(mask&(1<<i))
{
if(i==0 && mask!=(1<<node)+1)
continue;
dp[mask][node]=min(dp[mask][node], hamilton(mask^(1<<node), i)+cost[i][node]);
}
}
return dp[mask][node];
}
int x, y, ans;
int main()
{
fin>>n>>m;
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
cost[i][j]=MOD;
memset(dp, -1, sizeof(dp));
for(int i=1;i<=m;++i)
{
fin>>x>>y>>cost[x][y];
v[y].push_back(x);
}
dp[1][0]=0;
ans=MOD;
for(auto i:v[0])
ans=min(ans, hamilton((1<<n)-1,i)+cost[i][0]);
if(ans==MOD)
fout<<"Nu exista solutie";
else fout<<ans;
return 0;
}