Pagini recente » Cod sursa (job #2676764) | Cod sursa (job #2337295) | Cod sursa (job #2160866) | Cod sursa (job #2630845) | Cod sursa (job #2364667)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define pii pair <int, int>
#define INF 0x3f3f3f3f
using namespace std;
ifstream f("hamilton.in");
ofstream g("hamilton.out");
int dp[(1<<19)][20]; // 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[20][20];
vector <int> v[20];
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;
}