Pagini recente » Cod sursa (job #3308557) | Cod sursa (job #2219012) | Cod sursa (job #139618) | Cod sursa (job #979328) | Cod sursa (job #3339176)
#include <fstream>
#define inf 2e9
using namespace std;
ifstream cin("hamilton.in");
ofstream cout("hamilton.out");
int dp[(1<<18)][20],x,y,n,m,c[20][20];
/// dp[mask][nod] = costul minim de a trece prin toate nodurile marcate cu 1 in masca a.i.
/// sa incep din 0 si sa termin in nod
signed main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=inf;
for(int i=0;i<(1<<n);i++)
for(int j=0;j<n;j++)
dp[i][j]=inf;
for(int i=1;i<=m;i++)
cin>>x>>y>>c[x][y];
dp[1][0]=0;
for(int i=1;i<(1<<n);i++)
for(int j=0;j<n;j++)
if((i>>j)&1)
for(int k=0;k<n;k++)
if(j!=k&&((i>>k)&1)&&c[j][k]!=inf&&dp[i-(1<<k)][j]!=inf)
dp[i][k]=min(dp[i][k],dp[i-(1<<k)][j]+c[j][k]);
int ans=inf;
for(int i=1;i<n;i++)
if(dp[(1<<n)-1][i]!=inf&&c[i][0]!=inf)
ans=min(ans,dp[(1<<n)-1][i]+c[i][0]);
if(ans==inf)
cout<<"Nu exista solutie";
else
cout<<ans;
return 0;
}