Pagini recente » Cod sursa (job #690343) | Istoria paginii runda/vinevara | Cod sursa (job #395198) | Cod sursa (job #2549893) | Cod sursa (job #1730016)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("hamilton.in");
ofstream out("hamilton.out");
const int maxn = 18;
int cost[maxn][maxn];
vector <int> v[maxn];
int dp[(1 << maxn)][maxn];
int main()
{
int n, m;
in >> n >> m;
for(int i = 0; i < maxn; i++)
for(int j = 0; j < maxn; j++)
cost[i][j] = 0x3f3f3f3f;
for(int i = 1; i <= m; i++)
{
int x, y, c;
in >> x >> y >> c;
v[x].push_back(y);
cost[x][y] = c;
}
for(int conf = 0; conf < (1 << maxn); conf++)
for(int i = 0; i < maxn; i++)
dp[conf][i] = 0x3f3f3f3f;
dp[1][0] = 0;
for(int conf = 1; conf < (1 << n) - 1; conf++)
{
for(int i = 0; i < n; i++)
{
if((conf & (1 << i)))
{
for(int k = 0; k < (int)v[i].size(); k++)
{
int x = v[i][k];
if(!(conf & (1 << x)))
dp[conf + (1 << x)][x] = min(dp[conf + (1 << x)][x], dp[conf][i] + cost[i][x]);
}
}
}
}
int mn = 0x3f3f3f3f;
for(int i = 1; i < n; i++)
mn = min(mn, dp[(1 << n) - 1][i] + cost[i][0]);
out << mn << "\n";
return 0;
}