文章目录

  • 使用深度优先搜索暴力求解旅行商问题
    • 1.题目描述
    • 2.问题分析与算法设计思路
    • 3.算法实现
    • 4.运行结果
    • 5.算法分析

使用深度优先搜索暴力求解旅行商问题

1.题目描述

商品推销员要去n个城市推销商品,城市从1至n编号,任意两个城市间有一定距离,该推销员从城市1出发,需要经过所有城市并回到城市1,求最短总路径长度。

把旅行商问题看作一种排列问题,不难想出,这道题的蛮力做法即穷举所有路线。选定起点有n种选法,选定起点后的下一个目的地有(n- 1)种选择方法,再下一个是(n-2)……总共有n!种排列方法,算法复杂度达到O(n!)。

一个20城市的TSP问题有大约60,000,000,000,000,000个可能解。如果一台计算机每秒搜索1000个解,需要大约1902587年才能搜索完所有的解。

因此蛮力法只能解决小规模问题。

2.问题分析与算法设计思路

总体思路: 深度优先搜索,递归

算法过程:

  1. 使用二维数组 dis 存放任意两个城市之间的距离

  2. 从城市 1 开始

  3. 使用一个循环遍历下一个城市的不同选择,且忽略已经走过的城市、不能直接到达的城市

  4. 每次遍历,更新到达当前城市走过的路径长度 len 。

  5. 走过所有城市后,len 再加上当前城市到城市 1 的距离(最后要回到 1 ),保存该条路径的长度。

  6. 在所有路径长度中找出最小值。

小结:

“先规划好思路,然后才开始编写代码”,这句话很早就听到说过了,但是能真正静下心来做到这一点的时候,却是不多。但我感觉,这很有用。

3.算法实现

完整可运行代码,C++实现:

//深度优先搜索求解旅行商问题
#include<iostream>
using namespace std;const int Max = 10;
int len_min = 999;//最短总路径长度int road[Max] = {1};//存放路径
int it_r = 1;//搜索求解
//参数dis:城市距离,now:所在城市,have:走过城市,
//len:走过路径长度,n:城市总数,num:已走过城市数
void dfs(int dis[][Max], int now, bool have[], int len, int n, int num){//显示路径 cout<<"road:";for(int i = 0; i < it_r; i++){cout<<road[i]<<" ";}cout<<endl;//一条完整路径 if(num == n){len += dis[now][1];if(len < len_min){len_min = len;}}//遍历下一个城市 for(int i = 2; i <= n; i++){//排除已走过、不能到达的城市 if(have[i] == true || dis[now][i] == 0){continue;}int len_next = len + dis[now][i];have[i] = true;road[it_r++] = i;dfs(dis, i, have, len_next, n, num+1);road[--it_r] = 0;have[i] = false;}
}int main(){int dis[Max][Max] = {};//任意两城市距离,0表示不能直接到达 bool have[Max] = {1};//已走过哪些城市 int n = 0;//城市的个数int e = 0;//道路的个数cin>>n>>e;for(int i = 1; i <= e; i++){int a = 0, b = 0, x = 0;cin>>a>>b>>x;dis[a][b] = x;dis[b][a] = x;} //显示城市距离 for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){cout<<dis[i][j]<<" ";}cout<<endl;}dfs(dis, 1, have, 0, n, 1);cout<<"最短路径:"<<len_min;return 0;
} /*
测试数据一
4 5
1 2 5
1 3 3
1 4 4
2 3 7
2 4 6
*/

4.运行结果

5.算法分析

算法的时间复杂度在前面的题目描述中已经讲到了,达到了 o ( n ! ) o(n!) o(n!) 。

空间复杂度应为 o ( n 2 ) o(n^2) o(n2),因为使用了二维数组来存放城市间距离。


感谢阅读

CSDN话题挑战赛第2期
参赛话题:学习笔记

算法 |【实验5.2】1-深度优先搜索暴力求解旅行商问题相关推荐

  1. 【算法】蓝桥杯dfs深度优先搜索之排列组合总结

    [导航] 上一篇文章 → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,再次声明下文的大部分灵感均来自于[CSDN]梅森上校<JAVA版本:DFS算法题解两 ...

  2. LeetCode算法总结-回溯法与深度优先搜索

    转载自  LeetCode算法总结-回溯法与深度优先搜索 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退 ...

  3. 【算法】蓝桥杯dfs深度优先搜索之图连通总结

    前言 上两篇文章 → <[算法]蓝桥杯dfs深度优先搜索之排列组合总结>      → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,第三次声明下文的 ...

  4. 算法:使用递归实现“深度优先搜索”的理解

    "深度"的理解 深度优先的关键,在于深度,一扎到底,有一种"不撞南墙,死都不回头"的勇猛. 理解深度优先搜索的关键,也就在深度上. 一般理解深度优先搜索会用迷宫 ...

  5. ACM算法笔记(十)深度优先搜索与宽度优先搜索

    深度优先搜索 事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 下面 ...

  6. 算法第十期——DFS(深度优先搜索)的剪枝优化

    目录 DFS:剪枝 DFS:有哪些剪枝方法 DFS例题一:剪格子 [思路] DFS例题二:路径之谜 [样例分析] DFS例题三:四阶幻方 [思路] [做法一] [做法二] DFS例题三:分考场 [样例 ...

  7. python实现大规模邻域搜索(LNS)求解旅行商问题(TSP)

    文章目录 1. 大规模邻域搜索算法 1.1. LNS定义 1.2. LNS邻域 1.3. LNS框架 2. 旅行商问题TSP 3. python代码示例及结果 1. 大规模邻域搜索算法 参考<H ...

  8. 南华大学计算机学院吴取劲,一种基于图深度优先搜索的基本路径集自动生成优化算法-南华大学学报.PDF...

    26 3 ( ) Vol. 26 No. 3 第 卷第 期 南华大学学报 自然科学版 2012 9 Journal of University of South China (Science and ...

  9. 【图论算法】深度优先搜索的应用

    文章目录 深度优先搜索 无向图 双连通性 双连通以及割点的概念 找出图中割点的算法 一个例子 欧拉回路 认识欧拉回路 找出欧拉回路的算法 一个例子 有向图 查找强分支 dfs简单应用--部分和问题 深 ...

最新文章

  1. CVE-2019-2725复现(从环境搭建到getshell)
  2. matlab fgoalattain,matlab优化工具箱 | 学步园
  3. Guns 编辑功能实现_入门试炼06
  4. 浅析Hibernate映射(五)——集合映射
  5. 阿里云(腾讯云类似)服务器控制台配置开放所有的端口
  6. 如何在定制化组件中实现并使用v-model
  7. IDEA中.properties配置文件输入中文显示Unicode编码,本地编辑器,服务器打开显示Unicode编码问题解决方案
  8. Linux下安装Scala
  9. 从零开始学习OpenWrt完美教程
  10. arcgis中python计算面积的表达式_解析ArcGis的字段计算器(一)——数值型数据计算,从“面积计算”开始...
  11. ZBrush雕刻人物:人体比例及肌肉骨骼介绍
  12. 软件架构师考试内容及题型
  13. sketch怎么把psd导出为HTML,如何巧妙将sketch文档完美转换成PSD
  14. MongoDB 索引创建
  15. 如何查看电脑mac地址
  16. 用户如何制作360度全景图?360度全景图有什么用?
  17. 基于littlevgl设计的手表模拟时钟表盘(附代码)
  18. vue实现导入表格数据【纯前端实现】
  19. java 雷达反射面积_请问:如何使用基本反射率雷达图中的dBZ值判断天气情况?比如多云、雷雨、晴等。谢谢!...
  20. 剖析KCP以及KCP在游戏中是如何使用的

热门文章

  1. 程序员被狂虐的17种姿势,简直不要太过分!
  2. 某车App 360度旋转看车效果实现
  3. 为了戒掉网瘾,我用PYTHON决定休息时间的活动[2:改进版]
  4. 开发与测试既相爱又相杀
  5. 从宏观到细节为你讲解前端性能优化
  6. java词法分析器实验报告_词法分析器实验报告(JAVA)
  7. 你知道对白配音文本怎么制作吗?
  8. 线性表☞顺序表篇(7000字细致入微讲解)
  9. 把K线的时间增加15分钟
  10. android百度云推聊(转)