Pagini recente » Cod sursa (job #1299762) | Cod sursa (job #1338643) | Cod sursa (job #337756) | Cod sursa (job #2985150) | Cod sursa (job #1365330)
#include <cstring>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
typedef std::vector< std::pair< int, int > >::iterator iter;
const int MAXN = 19;
const int INF = 0x3f3f3f3f;
std::ifstream f("hamilton.in");
std::ofstream g("hamilton.out");
int n, m;
std::vector< std::pair< int, int > > G[MAXN];
int dp[1 << 19][MAXN];
int main()
{
memset(dp, 0x3f, sizeof(dp));
f >> n >> m;
for (int i = 1; i <= m; i++) {
int x, y, c;
f >> x >> y >> c;
G[y].push_back(std::make_pair(x, c));
}
for (int i = 0; i < n; i++) {
dp[1 << i][i] = 0;
}
for (int mask = 1; mask < (1 << n); mask++) {
for (int x = 0; x < n; x++) {
if ((mask & (1 << x)) == 0) {
continue;
}
for (iter it = G[x].begin(); it != G[x].end(); it++) {
int y = it->first;
if ((mask & (1 << y)) == 0) {
continue;
}
dp[mask][x] = std::min(dp[mask][x], dp[mask ^ (1 << x)][y] + it->second);
}
}
}
int mn = INF;
for (iter it = G[0].begin(); it != G[0].end(); it++) {
int y = it->first;
mn = std::min(mn, dp[(1 << n) - 1][y] + it->second);
}
if (mn == INF) {
g << "Nu exista solutie" << std::endl;
}
else {
g << mn << std::endl;
}
f.close();
g.close();
return 0;
}