Held-Karp算法是动态规划的一种应用,用于解决旅行商问题 (TSP)。该算法通过记录部分路径的最小成本来避免重复计算,从而有效地降低计算复杂度。
Held-Karp算法使用一个状态压缩动态规划表dp
,其中dp[mask][i]
表示从起点出发,访问过所有由mask
表示的集合中的节点,并以节点i
结束的最小路径长度。
#include <iostream>
#include <vector>
#include <limits>
class HeldKarp {
private:
int n; // 城市数量
std::vector<std::vector<int>> distances; // 城市间距离矩阵
std::vector<std::vector<int>> dp; // 动态规划表
public:
// 构造函数,初始化距离矩阵和状态表
HeldKarp(const std::vector<std::vector<int>>& dist)
: distances(dist), n(dist.size()) {
int max_mask = 1 << n; // 最大的掩码数,即2^n
dp.resize(max_mask, std::vector<int>(n, std::numeric_limits<int>::max())); // 初始化动态规划表,默认值为无穷大
dp[1][0] = 0; // 起始城市的状态初始化为0
}
// 求解TSP问题的函数
int solve() {
for (int mask = 1;