Pagini recente » Cod sursa (job #1003579) | Cod sursa (job #229567) | Cod sursa (job #531857) | Cod sursa (job #3292415) | Cod sursa (job #2377110)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define pb push_back
using namespace std;
const int MAXN = 18, INF = 0x3f3f3f3f;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
int dp[(1 << MAXN) + 5][MAXN + 5], costs[MAXN + 5][MAXN + 5], n, m;
vector<int> edges[MAXN + 5];
void initialize() {
for (int i = 1; i < (1 << n); ++i)
for (int j = 0; j < n; ++j)
if (i != (1 << j))
dp[i][j] = INF;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
costs[i][j] = INF;
}
void read() {
int x, y, cost;
fin >> n >> m;
initialize();
for (int i = 0; i < m; ++i) {
fin >> x >> y >> cost;
edges[y].pb(x);
costs[x][y] = cost;
}
}
void solve() {
for (int i = 1; i < (1 << n); ++i)
for (int j = 0; j < n; ++j)
if (i & (1 << j))
for (auto &it: edges[j])
if (i & (1 << it))
dp[i][j] = min(dp[i][j], dp[i - (1 << j)][it] + costs[it][j]);
}
void print() {
int minVal = INF;
for (auto &it: edges[0])
minVal = min(minVal, dp[(1 << n) - 1][it] + costs[it][0]);
fout << minVal << "\n";
}
int main() {
read();
solve();
print();
return 0;
}