Cod sursa(job #2378477)
| Utilizator | Data | 12 martie 2019 12:44:15 | |
|---|---|---|---|
| Problema | Ciclu hamiltonian de cost minim | Scor | 100 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 1.33 kb |
#include <iostream>
#include <fstream>
#define pinf 20000000
using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
int d[262160][20],N,M,a[20][20],minn;
int main()
{
int i,j,x,y,c,k,aux;
fin>>N>>M;
for(i=1; i<=M; i++)
{
fin>>x>>y>>c;
a[x][y]=c;
}
for(i=3; i<=(1<<N)-1; i=i+2)
{
for(j=1; j<N; j++)
{
if((i&(1<<j))==(1<<j))
{
d[i][j]=pinf;
aux=i-(1<<j);
if(aux==1)
{
if(a[0][j]!=0)
d[i][j]=a[0][j];
else
d[i][j]=pinf;
}
else
{
for(k=1; k<N; k++)
{
if(((aux&(1<<k))==(1<<k)))
{
if(a[k][j]!=0)
d[i][j]=min(d[i][j],d[aux][k]+a[k][j]);
}
}
}
}
}
}
minn=pinf;
i=(1<<N)-1;
for(j=1; j<N; j++)
{
if(a[j][0]!=0)
minn=min(minn,d[i][j]+a[j][0]);
}
if(minn!=pinf)
fout<<minn;
else
fout<<"Nu exista solutie";
}
