深度优先搜索之在图上寻找路径
寻路问题
在图上如何寻找从1到8的路径
一种策略:只要能发现没走过的点,就走到它。有多个点可走就随便挑一个,如果无路可走就回退,再看看有没有走过的点可走
在图上如何寻找从1到8的路径
运气最好:1->2->4->8
运气稍差:1->2->4->5->6->8
运气坏:1->3->7->9=>7->A=>7=>3->5->6->8(双向箭头表示回退)
不连通的图,无法从结点1走到结点8
完整的尝试过程可能如下
1->2->4->3->7=>3=>4=>2->9=>2=>1
结论:不存在从1到8的路径
得出这个结论之前,一定会把从1出发能走到的点全部走过。
(在走的过程中,我们需要记住某一点已经被走过)
从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不了就回退,此种路径搜索策略就被称为深度优先搜索,简称深搜
其实称为远度优先搜索更容易理解一些,因为这种搜索策略能往前走一步就往前走一步,总是试图走的更远,所谓远近(或深度),就是以距离起点的步数来衡量的。
在图上寻找路径
int main(){将所有点都标记为新店;起点=1终点=8cout<<dfs(起点);
}
//判断从V出发能否走到终点
bool dfs(v){if(v为终点)return true;if(v为旧点)return false;将v标记为旧点对和v相邻的每个结点U{if(dfs(U)==true){return true;
}
}
return false;
}
判断从V出发是否能够走到终点,如果能,要记录路径
Node path[MAX_LEN]; //MAX_LEN取结点总数即可
int depth; //从起点走到它,走的深度,起点深度为0
//从起点出发,寻找到终点的路径, 并且在这过程中,要把走过的路径给记下来
bool dfs(V){if(V为终点){path[depth]=v; //记录到路径中去return true;
}
if(V为旧点)return false;
将v标记为旧点;
path[depth]=v; //没有走,就走这个点
++depth;
对和v相邻的每个结点U{if(dfs(U)==true){ //从u出发能不能到达终点return true;
}
//如果把和v相邻的每个顶点都试过了也无法走到终点,v就不应该出现在从起点到终点的路径上面。相当于回退,退到v的父节点上面
--depth;
return false;
}}
int main(){将所有点都标记为新点;depth=0;
//从起点到终点找路,如果找到了路,还得把路记下来,如果起点返回值为true,//说明我们已经找到了从起点到终点的路,并且这条路已经被记录在path数组
//里面了,这条路上面的结点数是由depth来记录的if(dfs(起点)){for(int i=0;i<=depth;++i){cout<<path[i]<<endl;
}
}
}
1->3->7->9=>7->A=>7=>3->5->6->8
分析过程:走1379,回退到7,把9给弹出去,走到A,又把A放进去了。然后回退到7,把A弹出去了,然后回退到3,把7弹出去了,然后从3走到5,把5放到path中,然后走到6,6被放到path中,然后再走到8,8被放到path中去了。此时就可以找到路径
path:1,3,5,6,8
遍历图上所有结点
dfs(v){if(v是旧点){return;
}
将v标记为旧点;
对和v相邻的每个点U{dfs(U);
}
}
int main(){将所有点都标记为新点;while(在图中能找到新点k)dfs(k);
}
深度优先搜索之在图上寻找路径相关推荐
- Ueditor 自定义多图上传路径及回显
上传: 多图上传的路径和单图上传的路径一样,设置方法:http://blog.csdn.net/justinytsoft/article/details/52538708 回显: 下图是回显修改的地方 ...
- 通过深度优先搜索(DFS)对图的边进行分类
对于在图G上进行深度优先搜索算法所产生的深度优先森林Gt,我们可以定义四种边的类型: 1.树边(Tree Edge):为深度优先森林中Gt的边.如果结点v是因算法对边(u,v)的搜索而首先被发现,则( ...
- 有上下界网络流 ---- P4843 清理雪道(DAG图上最小路径重复边覆盖)【模板】有源汇上下界最小流
题目链接 题目大意: 解题思路: 首先我们发现对于每条边至少要覆盖一次,最多覆盖无数次 那么就有点像上下界网络流了[1,INF][1,INF][1,INF]的限制关系 跑一边最小流就可以了!! #in ...
- 算法:深度优先搜索(一)
一.在图上寻找路径和遍历 在图上如何寻找从1到8的路径? 不连通的图,无法从节点1走到节点8 从起点出发,走过的点要标记,发现有没有走过的点,就随意挑选一个往前走,走不了就回退,此种路径搜索策略就称为 ...
- 图的广度优先搜索(bfs)以及深度优先搜索(dfs)
1.前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次. 但是图的遍历相对树而言要更为复杂.因为图中的任意顶点都可能与其他顶点相邻,所以在图的遍历中 ...
- 图的广度优先搜索(BFS)和深度优先搜索(DFS)算法解析
BFS和DFS算法解析 [算法入门] 2018/6/2 1.前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次. 但是图的遍历相对树而言要更为复杂. ...
- 图的遍历——深度优先搜索+广度优先搜索
一:图的遍历--深度优先搜索 在本文其他内容中只是大体概括了主要的图论内容,更加详细的代码实现及算法分析在此给出. 深度优先搜索(DFS)类似树的先序遍历. 假设初始状态是图中所有顶点未曾被访问,则深 ...
- 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)
目录 一.图的遍历概念 二.深度优先搜索(DFS) (一)DFS算法步骤 1.邻接表DFS算法步骤 2.邻接矩阵DFS算法步骤 (二)深度优先生成树.森林 (三)DFS的空间复杂度和时间复杂度 三.广 ...
- DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释,剪枝技巧)
目录 那年深夏 引入 1.什么是深度优先搜索(DFS)? 2.什么是栈? 3.什么是递归? 图解过程 问题示例 1.全排列问题 2.迷宫问题 3.棋盘问题(N皇后) 4.加法分解 模板 剪枝 1.简介 ...
最新文章
- 如何防止我的模型过拟合?这篇文章给出了6大必备方法
- php soap webservice 实例
- Hexo瞎折腾系列(8) - 添加评论系统
- h5 修改title 微信_微信h5网页自定义分享(标题、描述、图标)
- jhipster 配置 mysql_java – 将jhipster后端和前端分成两个项目?
- JVM源码分析之javaagent原理完全解读
- linux下查看隐藏的文件
- SPSS学习中涉及的统计知识
- python规模大小的指标是_训练数据多少才够用
- php比较营业时间,使用php以人类可读格式从数据库表打印餐厅营业时间
- 【计算机组成原理】定点乘法运算之原码两位乘法
- ASP.NET---母板应用
- 传统机器学习和深度神经网络对比
- 【行空板教程】手写输入法
- linux设置法语键盘布局,法语键盘布局图
- gta5因为计算机丢失xinput1,GTA5 运行缺少这个xinput1-3.dll,怎样办
- vscode汇编环境配置
- 【Fuzzy】隶属度函数和模糊推理
- MacTeX的使用心得
- 腕象谈表:V6卡地亚山度士后镶满钻评测
热门文章
- 传华为将有2万名CNBG员工转岗CBG 回应:该消息不属实
- 疑似一加7渲染图曝光:弹出式自拍镜头+高颜值渐变配色
- 苹果AirPower总是跳票的原因找到了?或因商标被抢注
- 抢注“哔哩哔哩”商标卖成人用品?A站回应:不符合价值观 已申请注销
- DTMF采用RFC2833进行带内传输的实现[ZT]
- AS出现Error:Cause: peer not authenticated
- 【进击大厂之力扣每日打卡】七进制数
- Unable to establish loopback connection异常解决
- 【FLink】Flink SQL代码生成与UDF重复调用的优化
- 95-20-010-协议-Kafka的Request和Response