Pagini recente » Cod sursa (job #468056) | Cod sursa (job #205330) | Cod sursa (job #2863445) | Cod sursa (job #390064) | Cod sursa (job #1607076)
#include <fstream>
#include <vector>
#include <cstring>
#define INF 1000000000
#define MAXN 20
#define MAXX 270000
using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
vector<int> v[MAXN];
int dinamica[MAXX][MAXN],n,m,i,j,x,y,c,Cost[MAXN][MAXN],sol;
int main()
{
fin>>n>>m;
memset(Cost, INF, sizeof(Cost));
for (i=1;i<=m;i++)
{
fin>>x>>y>>c;
v[y].push_back(x); /// in v[y] stocam toate nodurile care au muchie directa catre nodul y;
Cost[x][y] = c;
}
memset(dinamica, INF, sizeof(dinamica));
dinamica[1][0] = 0;
for (i=0;i<(1<<n);++i)
for (j=0;j<n;++j)
if (i&(1<<j))
for (vector<int>::iterator k = v[j].begin(); k != v[j].end(); ++k)
if (i&(1<<(*k)))
dinamica[i][j] = min(dinamica[i][j], dinamica[i^(1<<j)][*k]+Cost[*k][j]);
sol = INF;
for (vector<int>::iterator k = v[0].begin(); k != v[0].end(); ++k)
sol = min(sol, dinamica[(1<<n) - 1][*k] + Cost[*k][0]);
if (sol == INF)
fout<<"Nu exista solutie";
else
fout<<sol;
return 0;
}