Pagini recente » Cod sursa (job #1248733) | Cod sursa (job #2068520) | Cod sursa (job #382632) | Cod sursa (job #1181818) | Cod sursa (job #1749018)
#include <bits/stdc++.h>
#define maxN 20
#define maxP (1 << 18) + 2
#define mp make_pair
#define pii pair < int, int >
#define f first
#define s second
#define inf 1000000000
using namespace std;
int n, m, all, ans, dp[maxN][maxP];
vector < pii > V[maxN];
void read()
{
freopen("hamilton.in", "r", stdin);
scanf("%d %d", &n, &m);
while (m --)
{
int x, y, c;
scanf("%d %d %d", &x, &y, &c);
V[y].push_back(mp(x, c));
}
}
int Cost(int x, int conf)
{
int i, nod;
if (dp[x][conf] != -1)
return dp[x][conf];
dp[x][conf] = inf;
for (i = 0; i < V[x].size(); ++ i)
if (conf & (1 << (nod = V[x][i].f)))
{
if (nod == 0 && conf != (1 << x) + 1)
continue;
if (dp[x][conf] > Cost(nod, conf ^ (1 << x)) + V[x][i].s)
dp[x][conf] = dp[nod][conf ^ (1 << x)] + V[x][i].s;
}
return dp[x][conf];
}
void init()
{
all = (1 << n) - 1;
memset(dp, -1, sizeof(dp));
dp[0][1] = 0;
ans = inf;
}
void solve()
{
int i;
init();
for (i = 0; i < V[0].size(); ++ i)
if (Cost(V[0][i].f, all) + V[0][i].s < ans)
ans = dp[V[0][i].f][all] + V[0][i].s;
}
void write()
{
freopen("hamilton.out", "w", stdout);
printf("%d\n", ans);
}
int main()
{
read();
solve();
write();
return 0;
}