深度优先遍历

大臣的旅费(深度优先遍历)

我的未来我决定 提交于 2020-03-09 00:17:43
大臣的旅费(深度优先遍历) 题目 问题描述 很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。 J是T国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情。他有一个钱袋,用于存放往来城市间的路费。 聪明的J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第x千米到第x + 1 千米这一千米中(x是整数),他花费的路费是x + 10 这么多。也就是说走 1 千米花费 11 ,走 2 千米要花费 23 。 J大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢? 输入格式 输入的第一行包含一个整数n,表示包括首都在内的T王国的城市数 城市从 1 开始依次编号, 1 号城市为首都。 接下来n - 1 行,描述T国的高速路(T国的高速路一定是n - 1 条) 每行三个整数Pi , Qi , Di,表示城市Pi和城市Qi之间有一条高速路,长度为Di千米。 输出格式 输出一个整数,表示大臣J最多花费的路费是多少。 样例输入 1 5

二叉树的递归,非递归遍历,深度优先遍历,广度优先遍历

馋奶兔 提交于 2020-03-01 03:57:10
/** * 二叉树的定义和遍历 */ public class BinaryTree { /** * 打印节点的信息 */ public void printNode(TreeNode<String> node){ System.out.print(node.getData()+" "); } /** * 递归先序遍历二叉树 */ public void preIterator(TreeNode<String> node){ this.printNode(node); if (node.getLefNode() != null) { this.preIterator(node.getLefNode()); } if (node.getRigNode() != null) { this.preIterator(node.getRigNode()); } } /** * 递归中序遍历二叉树 */ public void midIterator(TreeNode<String> node){ if (node.getLefNode() != null) { midIterator(node.getLefNode()); } this.printNode(node); if (node.getRigNode() != null) { midIterator(node.getRigNode(

广度优先遍历和深度优先遍历

荒凉一梦 提交于 2020-02-28 14:40:35
1.BFS   广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点。需要注意的是,遍历过的节点不能再次被遍历。 如上图所示: 第一层:   0 -> {6,2,1,5} 第二层:   6 -> {4}   2 -> {}   1 -> {}   5 -> {3} 第三层:   4 -> {}   3 -> {}   每一层遍历的节点都与根节点距离相同。设 di 表示第 i 个节点与根节点的距离,推导出一个结论:对于先遍历的节点 i 与后遍历的节点 j,有 di <= dj。利用这个结论,可以求解最短路径等最优解问题:第一次遍历到目的节点,其所经过的路径为最短路径。应该注意的是,使用 BFS 只能求解无权图的最短路径,无权图是指从一个节点到另一个节点的代价都记为1。 在程序实现 BFS 时需要考虑以下问题: 1.队列:用来存储每一轮遍历得到的节点; 2.标记:对于遍历过的节点,应该将它标记,防止重复遍历。 2.DFS   广度优先搜索一层一层遍历,每一层得到的所有新节点,要用队列存储起来以备下一层遍历的时候再遍历。   而深度优先搜索在得到一个新节点时立即对新节点进行遍历:从节点 0 出发开始遍历,得到到新节点 6 时,立马对新节点 6 进行遍历,得到新节点 4;如此反复以这种方式遍历新节点,直到没有新节点了,此时返回。返回到根节点

图的创建,图的深度优先遍历和广度优先遍历

柔情痞子 提交于 2020-02-21 19:53:20
图 图的表现形式: 邻接矩阵:使用二维数组,行列表示各个顶点,使用规定的数来表示两个顶点之间是否存在边。 例如: 上面就是上面图的邻接矩阵,其中0代表无连接,1代表链接。 除了使用邻接矩阵,还可以使用邻接表表示,邻接表就是针对每一个顶点有一个链表,该链表指向了每一个可以链接的顶点。所有顶点的链表构成的数组。 JAVA构建图: // 存储图的顶点 private List < String > vertexList ; // 邻接矩阵 private int [ ] [ ] edges ; // 边的条数 private int numOfEdges ; // 标记顶点是否有被访问过 private boolean [ ] isVisited ; // 初始化一个n个顶点的图 public Graph ( int n ) { edges = new int [ n ] [ n ] ; vertexList = new ArrayList < String > ( n ) ; } /** * 添加图的边 * * @param v1 第一个顶点下标 * @param v2 第二个顶点下标 * @param weight 权值 */ public void insertEdge ( int v1 , int v2 , int weight ) { // 构建的无向图 edges [ v1

DFS深度优先遍历经典例题总结

旧城冷巷雨未停 提交于 2020-02-05 22:50:27
DFS的大概模板 void dfs ( int x ) //关于传入参数问题,根据题意而定,看在题目运行的过程中,哪些是在变得 { if ( 满足输出条件 ) { 输出解 ; return ; } if ( 目前已经没有必要进行下去的条件 ) { return ; } //剪枝操作 //如果传入的条件,还需要继续搜下去,分析每一种情况后面跟哪些情况,然后循环,每个情况(注意前提:得符合题意)都深搜一下 for ( int i = 1 ; i <= 每种情况数 ; i ++ ) if ( 满足进一步搜索条件 ) //判断是否合理 { 为进一步搜索所需要的状态打上标记 ; //是需要的状态 dfs ( t + 1 ) ; 恢复到打标记前的状态 ; //也就是说的{回溯一步} } } } 拿最经典的八皇后问题解释dfs,正常情况下,如果有一个6*6的棋盘,在第一行,选择落子,不考虑规则限制,我们有6种落子方式。 第二行,有1 2 3 4 5 6,6种落子方式。以此类推,6的6次方种情况。 但现在由于规则限制,跟bfs一样根据流程想出一个树出来。指需要按照规则取舍一下那些结点有,哪些没有即可,搜索方式上采取递归+回溯 从最终结果上,呈现出来的是从根节点一条路走到底,然后撤回底点的上一个结点,撤回后能走另一个,就走另一个 DFS传入的参数一定要能表示出每个情况的状态 例题1 P1219

图,深度优先遍历与广度优先遍历

有些话、适合烂在心里 提交于 2020-02-01 16:58:25
1.为什么要有图 1)前面学了线性表和树 2)线性表局限于一个直接前驱和直接后继的关系 3)树也只能有一个直接前驱也就是父节点 4)当我们需要表示多对多的关系时,这里就需要用到图 图也是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接成为边。结点也可以称为顶点。 图的相关概念: 图的表示方式: 图的深度优先 图的广度优先 代码实现: import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; public class Graph { private ArrayList<String> vertexList; //存储顶点集合 private int[][] edges; //存储图对应的邻结矩阵 private int numOfEdges; //表示边的数目 //定义给数组boolean[], 记录某个结点是否被访问 private boolean[] isVisited; public static void main(String[] args) { //测试一把图是否创建ok int n = 8; //结点的个数 //String Vertexs[] = {"A", "B", "C", "D", "E"}; String Vertexs[] = {"1

图的深度优先遍历和广度优先遍历

谁说我不能喝 提交于 2020-01-15 10:01:57
1.图的深度优先遍历:是先遍历第一个邻结点,然后以第一个邻结点为参考系,递归遍历第一个邻节点的邻节点。 2.图的广度优先遍历是先遍历一个节点所有相邻节点,再遍历第一个相邻节点的所有相邻节点,以此类推,需要借助栈来进行操作。 public class Graph { private ArrayList<String> vertexList;//存储顶点的集合 private int[][] edges;//存储图对应的临接矩阵 private int numsEdges;//边的个数 private boolean[] isVisit;//是否被访问 public static void main(String[] args) { int n = 5;//图有5个顶点 String[] Vertexs = {"A","B","C","D","E"};//顶点数组 Graph graph = new Graph(n); for(String vertex:Vertexs){ graph.insertVertex(vertex);//将顶点插入到图中 } //构建边的关系 // A-B A-C B-C B-D B-E graph.addEdge(0,1,1); graph.addEdge(0,2,1); graph.addEdge(1,2,1); graph.addEdge(1,3,1)

浅谈图的深度优先遍历

梦想与她 提交于 2019-12-26 07:08:24
一、图的深度优先概述 图,就是 由一些小圆点(称为顶点)和连接这些小圆点的直线(称为边)组成的 。例如: 上图是由五个顶点(编号为1、2、3、4、5)和五条边(1-2、1-3、1-5、2-4、3-5)组成。 现在我们从1号顶点开始遍历这个图(遍历指的是把每一个顶点都访问一次)。使用深度优先搜索来遍历这个图我们将得到以下结果: 使用深度优先搜索来遍历这个图的具体过程是: 首先从一个未走到过的顶点作为起始顶点,比如1号顶点作为起点。 沿1号顶点的边去尝试访问其它未走到过的顶点,首先发现2号顶点还没有走到过,于是来到了2号顶点。 再以2号顶点作为出发点继续尝试访问其它未走到过的顶点,这样又来到了4号顶点。 再以4号顶点作为出发点继续尝试访问其它未走到过的顶点。 但是,此时沿4号顶点的边,已经不能访问到其它未走到过的顶点了,所以需要返回到2号顶点。 返回到2号顶点后,发现沿2号顶点的边也不能再访问到其它未走到过的顶点。此时又会来到3号顶点(2->1->3),再以3号顶点作为出发点继续访问其它未走到过的顶点,于是又来到了5号顶点。 至此,所有顶点我们都走到过了,遍历结束。 深度优先遍历的主要思想是: 首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点; 当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直到所有的顶点都被访问过。 在此我想用一句话来形容

PTA 凑零钱(深度优先遍历)

拟墨画扇 提交于 2019-12-11 00:30:01
韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有 10000 枚来自各个星球的硬币,需要请你帮她盘算一下,是否可能精确凑出要付的款额。 输入格式: 输入第一行给出两个正整数: N( ≤)是硬币的总个数, M( ≤)是韩梅梅要付的款额。第二行给出 N 枚硬币的正整数面值。数字间以空格分隔。 输出格式: 在一行中输出硬币的面值 V ​ 1 ​​ ≤ V ​ 2 ​​ ≤ ⋯ ≤ V ​ k ​​,满足条件 .。数字间以 1 个空格分隔,行首尾不得有多余空格。若解不唯一,则输出最小序列。若无解,则输出 No Solution 。 注:我们说序列{ [ }比{ [ }“小”,是指存在 k ≥ 1 使得 [ 对所有 i < k 成立,并且 [。 输入样例 1: 8 9 5 9 8 7 2 3 4 1 输出样例 1: 1 3 5 输入样例 2: 4 8 7 2 4 3 输出样例 2: No Solution 代码示例: #include<iostream> #include<vector> #include<algorithm> using namespace std; int s[10000]; int n,m; vector<int>p; bool flag=false; void dfs

DOM深度优先遍历算法

妖精的绣舞 提交于 2019-12-05 07:02:38
通过深度优先遍历算法,可以依次获取每个后代节点的对象。 顺序:有子元素先获取子元素,再获取兄弟元素 主要有2步骤: //1.创建节点迭代器对象(parent是要遍历的节点) var iterator = document.createNodeIterator(parent, NodeFilter.SHOW_ELEMENT, null, false); //2.反复调用iterator的nextNode方法跳到下一个 do{   var node = iterator.nextNode();   if(node != null) console.log(node.nodeName);   else break; }while(true); 以上也可以使用递归实现,但递归效率较低,不建议使用。 来源: https://www.cnblogs.com/1016391912pm/p/11912503.html