Pagini recente » Cod sursa (job #1321878) | Rating Codreanu Andrei Marian (Codreanu_Andrei_Marian_323CB) | Cod sursa (job #2284609) | Cod sursa (job #1611919) | Cod sursa (job #2773989)
#include <fstream>
using namespace std;
ifstream f("hamilton.in");
ofstream g("hamilton.out");
const int inf=99;
int n,m,i,x,y,c,j,t,xr,ans;
int graf[20][20],pow[20];
struct dinamica
{
int cost;
short int first;
}d[270000][20];
int main()
{
for(i=0;i<20;i++)
for(j=0;j<20;j++)
graf[i][j]=inf;
for(i=0;i<270000;i++)
for(j=0;j<20;j++)
{
d[i][j].cost=inf;
d[i][j].first=-1;
}
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y>>c;
graf[x][y]=c;
}
pow[0]=1;
for(i=1;i<=19;i++)
pow[i]=pow[i-1]*2;
for(i=0;i<n;i++)
{
d[pow[i]][i].cost=0;
d[pow[i]][i].first=i;
}
for(i=1;i<pow[n];i++)
{
for(j=0;j<n;j++)
{
xr=i^pow[j];
for(t=0;t<n;t++)
if( (xr&pow[t]) && (d[xr][t].cost+graf[t][j]<d[i][j].cost) )
{
d[i][j].cost=d[xr][t].cost+graf[t][j];
d[i][j].first=d[xr][t].first;
}
}
}
ans=inf;
for(i=0;i<n;i++)
{
x=d[pow[n]-1][i].first;
if(d[pow[n]-1][i].cost+graf[i][x]<ans)
ans=d[pow[n]-1][i].cost+graf[i][x];
}
if(ans==inf)
g<<"Nu exista solutie";
else
g<<ans;
return 0;
}