广度优先遍历

图算法:广度优先遍历

試著忘記壹切 提交于 2020-03-02 21:00:05
图的遍历算法包括广度优先遍历和深度优先遍历。其中深度遍历主要用于 解答树问题 的求解,而 深度遍历 往往为了获得 最短路径解 。什么是最短路径解呢?视具体情况而定,比如 最短的迭代步数 。在一般的隐式图中很常见,因为隐式图的规模往往是无穷的。 对于一般问题怎么思考呢?我想主要分三个步骤: 分析问题(解答树or最短路径);套用框架;剪枝优化 。 下面给出广度优先遍历的基本框架,关键词: 队列 。 #include <queue> #include <cstring> #include <cstdio> #define ONLINE 1 using namespace std; int graph[8][8]; int visited[8]; queue<int> q; char s[8]; void bfs(int root) { q.push(root); while (!q.empty()) { int k = q.front(); q.pop(); if (visited[k] != 1) { printf("%d ", k); visited[k] = 1; } for (int j = 0; j < 8; j++) { if (graph[k][j] == 1 && visited[j] != 1) { q.push(j); } } } } int main(int

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

馋奶兔 提交于 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-27 14:26:45
更多参考: 深度优先遍历:深度优先遍历是图论中的经典算法。其利用了深度优先搜索算法可以产生目标图的相应拓扑排序表,采用拓扑排序表可以解决很多相关的图论问题,如最大路径问题等等。 根据深度优先遍历的特点我们利用Java集合类的栈Stack先进后出的特点来实现。我用二叉树来进行深度优先搜索。 深度优先搜索的步骤为: (1)首先节点 1 进栈,节点1在栈顶; (2)然后节点1出栈,访问节点1,节点1的孩子节点3进栈,节点2进栈; (3)节点2在栈顶,然后节点2出栈,访问节点2 (4)节点2的孩子节点5进栈,节点4进栈 (5)节点4在栈顶,节点4出栈,访问节点4, (6)节点4左右孩子为空,然后节点5在栈顶,节点5出栈,访问节点5; (7)节点5左右孩子为空,然后节点3在站顶,节点3出栈,访问节点3; (8)节点3的孩子节点7进栈,节点6进栈 (9)节点6在栈顶,节点6出栈,访问节点6; (10)节点6的孩子为空,这个时候节点7在栈顶,节点7出栈,访问节点7 (11)节点7的左右孩子为空,此时栈为空,遍历结束。 广度优先遍历:广度优先遍历是连通图的一种遍历策略,因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域故得名。 根据广度优先遍历的特点我们利用Java数据结构队列Queue来实现。 广度优先搜索的步骤为: (1)节点1进队,节点1出队,访问节点1 (2

广度优先遍历算法

爱⌒轻易说出口 提交于 2020-02-22 09:14:19
广度优先遍历,这边就要涉及队列的处理,因为,我们一开始访问一个节点之后,访问跟这个结点直接相连的所有节点,这样相连的节点依次加入队列当中,保持队列的先进先出,每次出一个,再访问出的这个节点直接相连的节点,仍然依次进入队列当中。 这边我们知道队列的最大元素的个数,这边采用循环队列的结构。 typedef struct { int data[MAXSIZE]; int front; int rear; }Queue; 给出队列的入队,出队操作。 int enQueue(Queue *q,int e) { if((q->rear+1)%MAXSIZE==q->front) { return 0; } q->data[q->rear]=e; q->rear=(q->rear+1)%MAXSIZE; return 1; } int deQueue(Queue *q,int *e) { if(q->front==q->rear) return 0; *e=q->data[q->front]; q->front=(q->front+1)%MAXSIZE; return 1; } 给出整个代码: #include <stdio.h> #define MAXVEX 9 #define INFINITY 65535 #define MAXSIZE 9 //队列最大储存 typedef struct

数据结构复习 ---- 广度优先遍历(BFS)

試著忘記壹切 提交于 2020-02-02 21:31:52
一、广度优先遍历的定义 广度优先遍历(Breadth_First_Search),又称为广度优先搜索,简称BFS;如果说深度优先遍历类似树的前序遍历,那么广度优先遍历就类似于树的层序遍历;不过相对于深度优先遍历,广度优先遍历借助了一个队列来辅助,利用队列先进先出的性质实现广度优先,看似复杂一些,其实也很好理解;先看代码~ 二、广度优先的实现 邻接矩阵 该算法的整体思路是先初始化标志数组,然后用双重循环各顶点;第一层循环,防止图不连通;二层循环是广度优先的核心,将顶点i的所有邻接顶点都放入队列,然后对队列进行出队操作,出队时返回出队顶点在顶点表中的位置,然后再将该出队顶点的邻接顶点入队,知道队列为空,这样该连通范围内的所有顶点都被遍历到了; bool visited[MAXVEX];与深度优先同样的标志数组,去重; 函数OutQueue,为了能够返回出队顶点的位置; bool visited [ MAXVEX ] ; int OutQueue ( Graph & graph , queue < char > & queue ) { char tempVex = queue . front ( ) ; for ( int i = 0 ; i < graph . numVertexes ; ++ i ) { if ( tempVex == graph . vexs [ i ] ) {

非递归实现广度优先遍历(BFS)

末鹿安然 提交于 2020-01-30 20:01:30
对于广度优先遍历,使用递归方式实现非常普遍,这里我们讨论一下如何使用非递归来实现 算法 1、以图的邻接矩阵为例 2、使用一个queue来保存访问顺序,每次取队首元素,如果其有邻接点,则将其所有邻接点入队,并设置visit数组为1,最后再将其出队 3、循环结束条件为:队列为空 代码实现 以下图为例 public class BfsIterateAdjacentMatrix { private static Map < Integer , String > idVertexMap = new HashMap < Integer , String > ( ) { { put ( 0 , "V0" ) ; put ( 1 , "V1" ) ; put ( 2 , "V2" ) ; put ( 3 , "V3" ) ; put ( 4 , "V4" ) ; put ( 5 , "V5" ) ; put ( 6 , "V6" ) ; put ( 7 , "V7" ) ; } } ; private static int [ ] [ ] adjacentMatrix = new int [ ] [ ] { //V0,V1,V2,V3,V4,V5,V6,V7 { 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 } , { 1 , 0 , 0 , 1 , 1 , 0 , 0 , 0 }

深度优先和广度优先遍历

て烟熏妆下的殇ゞ 提交于 2019-12-29 11:55:21
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在编程生活中,我们总会遇见属性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程。现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的) 1、深度优先 英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个 节点 只能访问一次。对于上面的例子来说深度优先遍历的结果就是:A,B,D,E,I,C,F,G,H.(假设先走子节点的的左侧)。 敲黑板!划重点! 深度优先遍历各个节点,需要使用到堆(Stack)这种数据结构。stack的特点是是先进后出 。整个遍历过程如下:注意出入栈顺序 首先将A节点压入堆中,stack(A); 将A节点弹出,同时将A的子节点C,B压入堆中,此时B在堆的顶部,stack(B,C); 将B节点弹出,同时将B的子节点E,D压入堆中,此时D在堆的顶部,stack(D,E,C); 将D节点弹出,没有子节点压入,此时E在堆的顶部,stack(E,C); 将E节点弹出,同时将E的子节点I压入,stack(I,C); JAVA伪代码如下: public void depthFirst() { Stack<Map<String, Object>> nodeStack = new Stack<Map<String,

20182315 第十周学习总结

a 夏天 提交于 2019-12-06 05:37:13
学号 20182315 《数据结构与面向对象程序设计》第10周学习总结 教材学习内容总结 第十周主要讲图的相关构成,因此我的学习思路是:依次学习图的类别,图得实现方法,图的遍历,最优图。 图的类别:图可分为有向图,无向图,带权图。顾名思义,无向图即为节点与节点之间没有方向。有向图的节点与节点之间有方向。带权图节点与节点之间的边有意义,其边有权值。 图得实现方法:图的实现方法有连接表,连接矩阵。连接矩阵本质上是一个二维数组,分为横向和纵向两个方向。可以以横向到纵向定义节点方向。连接表即为二维数组,数组头为每一个结点,后序结点为与数组头连接的结点。 图的遍历:图的遍历较为复杂,分为广度优先遍历与深度优先遍历。 (1)广度优先遍历:广度优先遍历要用到队列知识存放结点和MashMap来确定是否访问过此结点, 将起始点存入队列中,将其标记为以访问存入MashMap中。在将结点从队里取出,搜索该结点所连接的结点,将他们存入队中,设为以访问。再将他们依此取出进行上述操作,直到队列里没有需要操作的数字。 (2)深度优先遍历:广度优先遍历用栈来代替队列,因为他有先进先出的特性,另外,深度优先遍历直到结点进入迭代器将其设为已访问。 图的连接性:图得连接性可通过遍历来体现,如果图是全部连接起来的,那无论通过哪个节点进行遍历,遍历结点的结果都是一样的。如果不连通,那必定有一个结点的遍历结果为1。

20182324 2019-2020-1 《数据结构与面向对象程序设计》第10周学习总结

点点圈 提交于 2019-12-06 05:32:06
目录 20182324 2019-2020-1 《数据结构与面向对象程序设计》第10周学习总结 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 结对及互评 点评: 点评过的同学博客和代码 其他(感悟、思考等,可选) 学习进度条 参考资料 20182324 2019-2020-1 《数据结构与面向对象程序设计》第10周学习总结 教材学习内容总结 1、图 ( graph ) 由顶点 ( vertice ) 和边 ( edge ) 构成。一个图(Graph)是一个序偶<V, E>,记为G = <V, E>,其中: ( 1 )V = { v1 , v2 , … , vn } 是有限非空集合,vi 称为结点,V 称为结点集。 ( 2 )E 是有限集合,称为边集。E 中的每个元素都是 V 中顶点偶对,称之为边。 图中表示边的顶点对是无序的图是无向图 ( undirected graph )。图中的边是顶点的有序对的图称为有向图 ( directed graph,or digraph ) 2、图的表示:图可以用文字符号表述,也可以用图形描述,有两种形式: ( 1 )集合表示:对于一个图 G,如果将其记为 G = < V , E >,并写出 V 和 E 的集合表示,称为图的集合表示。 ( 2 )图形表示:用小圆圈表示 V 中的结点,用由 u

20182328 2019-2020-1 《数据结构与面向对象程序设计》第十周学习总结

∥☆過路亽.° 提交于 2019-12-06 05:12:20
20182328 2019-2020-1 《数据结构与面向对象程序设计》第十周学习总结 教材学习内容总结 图的概念 图由顶点和边组成。 邻接的(adjacent):图中的两个顶点之间有一条连通边。 邻居:邻接顶点。 自循环(环):连通一个顶点及其自身的边。 路径:由一个顶点到达另一个顶点。 路径长度:路径边的条数(顶点数 - 1)。 环路:一种首顶点和末顶点相同且没有重边的路径。没有环路则是无环的(acyclic)。 图的种类 无向图:是一种边为无序结点对的图。 完全的:无向图拥有最大数目的连通顶点的边。对于n个顶点的无向图,要是完全的,要有n(n-1)/2条边,假设没有边是自循环的。 连通的:无向图中任意两个顶点之间都存在一条路径。 无向树:一种连通的无环无向图,其中一个元素被指定为树根。 有向图:也称双向图,一种边为有序顶点对的图。 有向图的路径不是双向的,反方向路径不成立。 有向树:指定一个元素作为树根。 不存在其他顶点到树根的连接。 每个非树根元素恰好有一个连接。 树根到每个其他顶点都有一条路径。 网络:一种每条边都带有权重或代价的图。路径权重是该路径中各条边权重的和。 图的算法 遍历 广度优先遍历:类似树中的层次遍历。把图的每一邻接的横向依次遍历。 深度优先遍历:顾名思义,把图的每一邻接的纵向遍历,类似树的前序遍历。