Pagini recente » Cod sursa (job #2900335) | Cod sursa (job #1793659) | Cod sursa (job #2928422) | Cod sursa (job #30908) | Cod sursa (job #3267734)
#include <bits/stdc++.h>
using namespace std;
const int nmax=18, inf=1e9;
int dp[1<<nmax][21];//dp[x][y]=costul minim pentru un drum de la 0 pana la nodul y, nodurile viz sunmt reperezntate de x in baza 2
int n, m, a, b, c, ci;
vector <int> v[nmax];
int cost[nmax][nmax];
int main()
{
ifstream cin("hamilton.in");
ofstream cout("hamilton.out");
cin>>n>>m;
for(int i=0; i<n; i++)
{
for(int j=0; j<(1<<n); j++)
{
dp[j][i]=inf;
}
for(int j=0; j<n; j++)
{
cost[i][j]=inf;
}
}
for(int i=0; i<m; i++)
{
cin>>a>>b>>c;
v[b].push_back(a);
cost[a][b]=c;
}
dp[1][0]=0;
for(int i=1; i<(1<<n); i++)
{
for(int j=1; j<n; j++)
{
if(!((1<<j)&i)) continue;
for(auto x:v[j])
{
ci=i^(1<<j);
dp[i][j]=min(dp[i][j], dp[ci][x]+cost[x][j]);
}
}
}
bool ok=false;
int ans=inf;
for(int i=1; i<n; i++)
{
if(dp[(1<<n)-1][i]!=inf && cost[i][0]!=inf)
{
ok=true;
ans=min(ans, dp[(1<<n)-1][i]+cost[i][0]);
}
}
if(ok) cout<<ans;
else cout<<"Nu exista solutie";
return 0;
}