松盛号 松盛号

10条国内最适合自驾路线盘点 哈尔滨去北京自驾最短路线

10条国内最适合自驾路线盘点

德格印经院

其中1,2,3,4,5代表五个城市。此模型可抽象为图,可用邻接矩阵c表示,如下图所示:

 假设从顶点s出发,令d(i,V)表示从顶点i出发经过V(是一个点的集合)中各个顶点一次且仅一次,最后回到出发点s的最短路径长度。

        推导:(分情况来讨论)

        ②如果V不为空,那么就是对子问题的最优求解。你必须在V这个城市集合中,尝试每一个,并求出最优解。

        综上所述,TSP问题的动态规划方程就出来了:

现在对问题定义中的例子来说明TSP的求解过程。(假设出发城市是 0城市)

这里只画出了d(1,{2,3,4}),由于篇幅有限这里就不画了。

由上述动态规划公式d(i,V)表示从顶点i出发经过V(是一个点的集合)中各个顶点一次且仅一次,最后回到出发点s的最短路径长度。根据上述给的测试用例有5个城市编号0,1,2,3,4。那么访问n个城市,恰好访问每个城市一次,并最终回到出发城市的嘴短距离可表示为d(0,{1,2,3,4}),那么问题来了我们用什么数据结构表示d(i,V),这里我们就可二维数据dp[N][M]来表示,N表示城市的个数,M表示集合的数量,即,之所以这么表示因为集合V有个子集。根据测试用例可得出如下dp数组表格:

那么你们可能就有疑问了,为什么这么表示?这里说明一下比如集合{1,2,3,4}为什么用15表示,我们可以把集合中元素看成二进制1的位置二进制从右开始看,1表示从右开始第一位为1,2表示从又开始第二位为1,所以集合{1,2,3,4}可表示二进制1111转化为十进制为15。再举个例子比如集合{1,3}表示为二进制为0101,十进制为5。所以我们求出dp[0][15]通用表示dp[0][]就是本题的最终解。

注意:对于第y个城市,他的二进制表达为,1 (i - 1) ) & 1) == 1或者x &(14--->2--->3--->0七、代码编写

 #include#include#include#includeusingnamespacestd;#defineN5#defineINF10e7#definemin(a,b)((a>b)?b:a)staticconstintM=1";}//单独输出起点编号cout

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至[email protected]举报,一经查实,本站将立刻删除。