Pagini recente » Cod sursa (job #2364638) | Cod sursa (job #312761) | Cod sursa (job #3040827) | Cod sursa (job #1852406) | Cod sursa (job #2364674)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define pii pair <int, int>
#define INF 0x3f3f3f3f
#define Nmax 18
using namespace std;
ifstream f("hamilton.in");
ofstream g("hamilton.out");
int dp[(1<<Nmax)+5][Nmax+5]; // dp[i][j]-costul minim al unui ciclu care contine nodurile
// din confij lui i si se termina in nodul j
int n, m;
int a[Nmax+5][Nmax+5];
vector <int> v[Nmax+5];
int main()
{
f >> n >> m;
for (int i = 1, x, y, c; i <= m; i++)
{
f >> x >> y >> c;
a[x][y]=c;
v[x].push_back(y);
}
memset(dp, INF, sizeof(dp));
int p=(1<<n);
for (int i = 0; i < n; i++) dp[1][i]=0;
for (int stare = 0; stare < p; stare++)
{
for (int i = 0; i < n; i++)
if(stare&(1<<i))
{
for (auto k:v[i])
{
if(stare&(1<<k))
dp[stare][i]=min(dp[stare][i], dp[stare^(1<<i)][k]+a[i][k]);
}
}
}
int ans=INF;
for (int i = 0; i < n; i++)
if(a[0][i]!=0) ans=min(ans, dp[p-1][i]+a[0][i]);
if(ans!=INF) g << ans;
else g << "Nu exista solutie";
return 0;
}