daimayuan249 | 旅行商(状压, dp, 剪枝)
不难写出转移方程,
k为合法的前继城市, 则
最后可以看情况进行剪枝(状压枚举和dfs一样, 都是很适合剪枝的哦!)
剪枝1: pattern中没有1号城市的可以跳过
剪枝2: pattern中没有j, 但是要求此时在j城市的可以跳过
时间复杂度:
AC代码:
/*
Author: SJ
*/
#include<bits/stdc++.h>
const int N = 1e5 + 10;
const int INF = 1e9 + 7;
using ll = long long;
using ull = unsigned long long;
using namespace std;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
//freopen("data.in", "r", stdin);
//freopen("data.ans", "w", stdout);
int n;
cin >> n;
vector<vector<int>> a(n, vector<int>(n, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
vector<vector<int>> f((1 << n), vector<int>(n, INF));
f[1][0] = 0;
for (int i = 1; i < (1 << n); i++) {
if (!(i & 1)) continue;
for (int j = 0; j < n; j++) {
if (!(i & (1 << j))) continue;
for (int k = 0; k < n; k++) {
if (j != k && (i & (1 << k))) {
f[i][j] = min(f[i][j], f[i - (1 << j)][k] + a[k][j]);
}
}
}
}
int ans = INF;
for (int i = 0; i < n; i++) {
ans = min(f[(1 << n) - 1][i] + a[i][0], ans);
}
cout << ans;
return 0;
}
坑点1: 枚举合法前继时, 注意j == k的情况(其实不用)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端