1 条题解
-
0
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 21, inf = 0x3f3f3f3f; int n, m, a[N][N], dp[1 << N][N]; /* 状态:dp[i][j] 表示已经经过i集合的点,且最后在j点的最短 Hamilton 路径的长度. 初始化:dp[i][j]=inf, dp[i][i]=0 转移:k->j, dp[i][j] = min(dp[i][j], dp[i^(1<<j)][k]+a[k][j]); 目标:dp[(1<<n)-1][n-1] */ int main() { cin >> n; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) cin >> a[i][j]; memset(dp, 0x3f, sizeof dp); dp[1][0] = 0; for (int i = 1; i < (1 << n); i++) for (int j = 0; j < n; j++) if (i >> j & 1) for (int k = 0; k < n; k++) if (i ^ (1 << j) >> k & 1) dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][k] + a[k][j]); cout << dp[(1 << n) - 1][n - 1] << endl; }
- 1
信息
- ID
- 1429
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者