Bellman–Held–Karp算法求解包含限制的TSP问题
创始人
2024-11-29 00:00:51
0
  1. 定义问题:给定一个有n个点的加权有向图,其中某些点被标记为必须经过的点,要求从任意一个点出发,经过所有标记点并回到起点的最短路径。
  2. 构造子问题:将所有标记点划分为两组,记为A和B。从起点s出发,经过A中的所有点,最终到达B中的某个点t。子问题的解为:从s出发,经过A中的所有点,到达p,然后从p出发,经过B中的所有点,最终到达t的最短路径。
  3. 使用动态规划求解:设dp[S, i]表示从起点s出发,经过集合S中的点、最后一个访问的点为i的最短路径长度。状态转移方程为:

dp[S, i] = min(dp[S{i}, j] + dis(j, i)), 其中j∈S{i}

其中dis(j, i)表示从点j到i的距离,如果(i, j)不在图中,则dis(j, i)=∞。 4. 初始化:dp[∅, s] = 0。 5. 求解原问题:对于所有的标记点组合,使用该算法求解,并选择最小的路径作为最终解。时间复杂度为O(n22n)。

代码示例:

int n, m; int g[N][N]; // 存图 int f[1 << N][N]; // f[S][i]表示经过的点集为S,以i为终止点的最短路 int A[N], B[N], cnt; // A, B分别表示两个必经点集合,cnt记录选中的点数量 int d[N][N]; // d[i][j]表示i到j的距离 int main() { cin >> n >> m; memset(g, 0x3f, sizeof g); for (int i = 0; i < m; i++) { int a, b, w; cin >> a >> b >> w; g[a][b] = min(g[a][b], w); } int x; cin >> x; while (x--) { int a

相关内容

热门资讯

6分钟辅助!hhpoker是真... 6分钟辅助!hhpoker是真的假的,hhpoker真的有透视吗,演示教程(真是有挂)1、每一步都需...
第七分钟辅助!we poker... 第七分钟辅助!we poker插件,we poker免费辅助器,手筋教程(有挂方式)暗藏猫腻,小编详...
七分钟辅助!aa poker辅... 七分钟辅助!aa poker辅助包,pokemmo脚本辅助器下载,讲义教程(有挂秘籍)1、pokem...
第四分钟辅助!wepoker辅... 第四分钟辅助!wepoker辅助器安装包定制,aapoker透视脚本,大纲教程(有挂总结)所有人都在...
第四分钟辅助!wpk透视辅助靠... 第四分钟辅助!wpk透视辅助靠谱吗,wepoker透视苹果系统,诀窍教程(有挂猫腻);运wepoke...
七分钟辅助!aapoker透视... 七分钟辅助!aapoker透视脚本入口,wejoker开挂,学习教程(有挂教程)1、打开软件启动之后...
第四分钟辅助!淘宝买wepok... 第四分钟辅助!淘宝买wepoker透视有用吗,wpk俱乐部怎么作弊,积累教程(有挂规律)1、下载好淘...
6分钟辅助!we-poker软... 6分钟辅助!we-poker软件,购买的wpk辅助在哪里下载,积累教程(有挂技巧)购买的wpk辅助在...
第2分钟辅助!如何下载wepo... 第2分钟辅助!如何下载wepoker安装包,newpoker怎么安装脚本,教程书教程(今日头条)1、...
4分钟辅助!wepoker钻石... 4分钟辅助!wepoker钻石怎么看底牌,wepoker辅助器有哪些功能,法门教程(有挂详细)该软件...