Pagini recente » Cod sursa (job #297394) | Cod sursa (job #2081974) | Cod sursa (job #2166012) | Cod sursa (job #2161886) | Cod sursa (job #2871022)
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
int n, m;
struct muchie
{
int nod_curent, nod_urm, cost;
};
vector <muchie> v[20];
vector <muchie> vecini_externi;
int dp[20][300000];
const int MAAX=1e9;
int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
int a, b, c;
fin>>a>>b>>c;
muchie nou;
nou.cost=c;
nou.nod_curent=a;
nou.nod_urm=b;
v[a].push_back(nou);
if(b==0)
{
vecini_externi.push_back(nou);
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<=(1<<n)-1;j++)
{
dp[i][j]=MAAX;
}
}
dp[0][1]=0;
for(int i=1;i<=(1<<n)-1;i+=2)
{
for(int j=0;j<n;j++)
{
for(int x=0;x<v[j].size();x++)
{
muchie vecin=v[j][x];
int putere=(1<<vecin.nod_urm);
if((i & putere)==0)
{
dp[vecin.nod_urm][i+putere]=min(
dp[vecin.nod_urm][i+putere],
dp[j][i]+vecin.cost
);
}
}
}
}
int minim=MAAX;
for(int i=0;i<vecini_externi.size();i++)
{
muchie vecin=vecini_externi[i];
if(dp[vecin.nod_curent][(1<<n)-1]+vecin.cost<minim)
{
minim=dp[vecin.nod_curent][(1<<n)-1]+vecin.cost;
}
}
if(minim>=MAAX)
{
fout<<"Nu exista solutie";
}
else
{
fout<<minim;
}
return 0;
}