旅行商问题(深度优先搜索 回溯法 排列树)
1.问题描述:
有一个推销员,要到n个城市推销商品,他要找出一个包含所有n个城市的具有最短路程的环路。(最后回到原来的城市)
示例:从城市1出发经过所有城市后回到城市1,要使总路程最短。
2.算法设计:
给定n个城市的无向带权图G(V,E),顶点代表城市,权值代表城市之间的距离。若城市之间没有路径,则距离为无穷。
城市之间的距离存放在二维数组g[][]中。
从城市1出发,先到临近城市2,将走过的路程存放在变量 cl 中。
bestl代表当前找到的一种最短路径长度。如走法:1-2-3-4-5-1
显然,向城市深处走时,cl只会增加。因此当cl>bestl时,不必再往深处走。
限界条件为cl<bestl, cl 初值为0,bestf初值为∞
3.代码:
#include<iostream>
using namespace std;
#define MAX 1000
int g[100][100],x[100],bestx[100];int cl=0,bestl=MAX,n;void Traveling(int t)
{int j;if(t>n) //到达叶子结点{if(g[x[n]][1]!=-1 && (cl+g[x[n]][1]<bestl))//推销员到的最后一个城市与出发的城市之间有路径,且当前总距离比当前最优值小{for(j=1; j<=n; j++)bestx[j]=x[j];bestl=cl+g[x[n]][1];}}else //没有到达叶子结点{for(j=t; j<=n; j++)//搜索扩展结点的左右分支,即所有与当前所在城市临近的城市{if(g[x[t-1]][x[j]]!=-1 && (cl+g[x[t-1]][x[j]]<bestl))//若果第t-1个城市与第t个城市之间有路径且可以得到更短的路线{swap(x[t],x[j]); //保存要去的第t个城市到x[t]中cl+=g[x[t-1]][x[t]]; //路线长度增加Traveling(t+1); //搜索下一个城市cl-=g[x[t-1]][x[t]];swap(x[t],x[j]);}}}
}
int main()
{int i,j;cout<<"请输入一共有几个城市:"<<endl;cin>>n;cout<<"请输入城市之间的距离"<<endl;for(i=1; i<=n; i++)for(j=1; j<=n; j++)cin>>g[i][j];for(i=1; i<=n; i++){x[i]=i;bestx[i]=0;}Traveling(2);cout<<"城市路线:"<<endl;for(i=1; i<=n; i++)cout<<bestx[i]<<' ';cout<<bestx[1];cout<<endl;cout<<"最短路线长度:"<<endl;cout<<bestl<<endl;return 0;
}
/*
测试数据:
5
-1 10 -1 4 12
10 -1 15 8 5
-1 15 -1 7 304 8 7 -1 6
12 5 30 6 -1
*/
旅行商问题(深度优先搜索 回溯法 排列树)相关推荐
- 基于深度优先搜索回溯法的人狼羊菜过河模型
基于深度优先搜索回溯法的人狼羊菜过河模型 本文介绍一个农夫过河的小模型,算法 Python 实现,感觉还挺有趣的,因原为笔者课程作业论文改版而来,所以文章内容比起其他博客文章可能会比较严肃与严谨.期待 ...
- python全排列问题_Python基于回溯法子集树模板解决全排列问题示例
本文实例讲述了Python基于回溯法子集树模板解决全排列问题.分享给大家供大家参考,具体如下: 问题 实现 'a', 'b', 'c', 'd' 四个元素的全排列. 分析 这个问题可以直接套用排列树模 ...
- python回溯方法的模板_实例讲解Python基于回溯法子集树模板实现图的遍历功能
这篇文章主要介绍了Python基于回溯法子集树模板实现图的遍历功能,结合实例形式分析了Python使用回溯法子集树模板针对图形遍历问题的相关操作技巧与注意事项,需要的朋友可以参考下 本文实例讲述了Py ...
- python 回溯法 子集树模板 系列 —— 3、0-1背包问题
问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其 ...
- python找零钱问题_Python基于回溯法子集树模板解决找零问题示例
本文实例讲述了Python基于回溯法子集树模板解决找零问题.分享给大家供大家参考,具体如下: 问题 有面额10元.5元.2元.1元的硬币,数量分别为3个.5个.7个.12个.现在需要给顾客找零16元, ...
- python回溯方法的模板_Python基于回溯法子集树模板解决0-1背包问题实例
本文实例讲述了Python基于回溯法子集树模板解决0-1背包问题.分享给大家供大家参考,具体如下: 问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入 ...
- python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例
本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题.分享给大家供大家参考,具体如下: 问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方 ...
- 八皇后问题python回溯_解决Python基于回溯法子集树模板实现8皇后问题
这篇文章主要介绍了Python基于回溯法子集树模板实现8皇后问题,简单说明了8皇后问题的原理并结合实例形式分析了Python回溯法子集树模板解决8皇后问题的具体实现技巧,需要的朋友可以参考下 本文实例 ...
- LeetCode之单词搜索(回溯法求解)
题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过相邻的单元格内 ...
最新文章
- TVM优化Deep Learning GPU算子
- JS-只能输入中文和英文
- 浏览器本地mysql_IndexedDB:浏览器里的本地数据库
- java实现责任链模式_我的Java设计模式-责任链模式
- 心态很容易受别人影响_阳光心态的句子,句句动人心弦,送给追梦路上的你
- java 两个字段排序,如何在Java中按两个字段排序?
- CSS定位总结:position=static/relative/absolute/fixed时的区别、top/bottom/left/right与margin外边距的运用
- # 2017-2018-1 20155336《信息安全技术》实验二——Windows口令破解
- matlab 乱七八糟求最大值~
- java.lang.IllegalStateException报警
- sd卡升级 c语言程序,奔驰C级导航SD卡怎么升级
- 关于 Uncaught ReferenceError: mOxie is not defined情况下的问题
- 塔望食品品牌策划|食品行业怎么讲好品牌故事
- 私藏版64页DevOps笔记免费分享
- tda4vm如何SPL方式加载MCU域的核?
- mysql教程 check_Check
- 服务器型号类型,cpu类型和型号服务器
- 【解禁】钉钉直播回放下载
- VMware官方下载安装包的方法
- node js 写按键精灵_带有按键的Node.js Raw模式