Pagini recente » Cod sursa (job #2896636) | Cod sursa (job #734138) | Cod sursa (job #1841938) | Cod sursa (job #2734317) | Cod sursa (job #1410607)
#include <fstream>
#include <vector>
#include <cstring>
#define NMax 20
#define oo 100000000
using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
int N,M,Sol=oo;
int A[NMax][NMax];
int DP[262150][NMax];
vector <int> G[NMax];
void Read()
{
fin>>N>>M;
memset(A,oo,sizeof(A));
for(int i=1;i<=M;i++)
{
int x,y,c;
fin>>x>>y>>c;
G[y].push_back(x);
A[x][y] = c;
}
}
void Solve()
{
for(int i=0;i<(1<<N); i++)
for(int j = 0; j < N; j++)
DP[i][j] = oo;
DP[1][0] = 0;
for(int i=1;i<(1<<N); i++)
{
for(int Node = 0; Node < N; Node++)
{
if(i & (1<<Node))
for(int k = 0; k < (int) G[Node].size(); k++)
{
int Vecin = G[Node][k];
if(i & (1<<Vecin))
{
DP[i][Node] = min(DP[i][Node], DP[i-(1<<Node)][Vecin] + A[Vecin][Node]);
}
}
}
}
for(int i = 0; i < (int) G[0].size(); i++)
{
int Vecin = G[0][i];
Sol = min(Sol, DP[(1<<N)-1][Vecin] + A[Vecin][0]);
}
}
void Print()
{
fout<<Sol<<"\n";
}
int main()
{
Read();
Solve();
Print();
return 0;
}