11.23-周日上午-状态压缩专题测试
P4802 [CCO 2015] 路短最
他不想重复访问任何城市,请帮他找出最长路径。
2\le n \le 18
那么我们可以想到Hamilton路径,原题面是让我们从
设
推一下状转:我们先枚举每一种状态,再枚举每一位为
注意是从
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 25;
int n, dis[N][N], dp[1 << 20][N];
int m;
signed main()
{
cin >> n >> m;
for (int i = 0; i <= n; i++)
for (int j = 0; j <= n; j++)
dis[i][j] = -1e9;
for (int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
dis[u][v] = w;
}
int maxi = (1 << n) - 1;
for (int st = 0; st <= maxi; st++)
for (int j = 0; j < n; j++)
dp[st][j] = -1e9;
dp[1][0] = 0;
for (int i = 0; i <= maxi; i++)
{
for (int j = 0; j < n; j++)
{
if (!((i >> j) & 1))
continue;
int tmp = (i ^ (1 << j));
for (int k = 0; k < n; k++)
if ((tmp >> k) & 1)
dp[i][j] = max(dp[i][j], dp[tmp][k] + dis[k][j]);
}
}
int ans = 0;
for (int i = 0; i <= maxi; i++)
ans = max(ans, dp[i][n - 1]);
cout << ans;
return 0;
}