题目链接:传送门
从
0
0
0点走到
n
−
1
n-1
n−1点,每个点最多走一次,求最长路径
设
f
[
i
]
[
S
]
f[i][S]
f[i][S]表示当前在
i
i
i点,经过的路经集合为
S
S
S的最长路
由于每个点最多经过一次,所以转移很显然
如果下一个枚举到的点
v
v
v不在路径集合
S
S
S中,即!(S & (1<<v))
用记搜来实现
/**
* @Date: 2019-10-19T16:56:21+08:00
* @Last modified time: 2019-10-20T19:08:57+08:00
*/
#include <bits/stdc++.h>
#define A 1010
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
struct node {int next, to, w;}e[A];
int head[A], num;
void add(int fr, int to, int w) {e[++num].next = head[fr]; e[num].to = to; e[num].w = w; head[fr] = num;}
int f[18][1 << 18], n, m, a, b, c;
int dfs(int fr, int S) {
if (fr == n - 1) return 0;
if (~f[fr][S]) return f[fr][S];
int ans = -inf;
for (int i = head[fr]; i; i = e[i].next) {
int ca = e[i].to;
if (!(S & (1 << ca)))
ans = max(ans, e[i].w + dfs(ca, S | (1 << ca)));
}
return f[fr][S] = ans;
}
int main(int argc, char const *argv[]) {
cin >> n >> m; memset(f, -1, sizeof f);
for (int i = 1; i <= m; i++) cin >> a >> b >> c, add(a, b, c);
cout << dfs(0, 1) << endl;
}