c++ stack 遍历_划重点啦!带你解读图的两种遍历方式
02图的遍历
1
深度优先遍历基本思想:首先访问图中起始顶点v,然后由v出发,访问与v邻接且未被访问的顶点再访问与v相邻且未被访问的顶点 w1...重复上述过程。当不能再继续向下访问时,依次退回到最近被的问的顶点,若它仍有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直至 图中所有顶点均被切问过为止。所以深度优先遍历的策略就是尽可能“深”的搜索一个图。
对以上无向图进行深度优先遍历,从a开始:
第1步:访问a
第2步:访问a的邻接点e(这里也可以访问b或c)
第3步:访问e的邻接点f(也可访问d)
第4步:访问f的邻接点d
第5步:此时d无还没有过的邻接点,退回到e,访问b
第6步:此时b也无还未被访问过的邻接点,故访问最后一个点c
因此访问顺序为:a->e->f->d->b->c(答案不唯一)
代码实现如下:(非递归)思想:深度优先遍历图的思想就是从初始顶点开始,一直访问其相邻的结点(在其相邻结点存在情况下)。故可利用一个栈记住上一个访问过的结点,当结点无邻接点时,可以退回到上一个结点,访问上一结点为被访问过的结点,直至所有顶点均被访问。
void Traver(AdjList g,vertype v){ struct arc *stack[];//初始化栈 visited[v]=1; printf(v); //输出顶点v,将该顶点的访问数组对应元素置为1 top=0; p=g[v].firstarc; stack[++top]=p; //初始化栈顶元素,将p指向初始顶点,将p入栈 while(top>0 || p!=null) //当栈中有元素或p不为空 { while (p) { if (p && visited[p->adjvex]) p=p->next; else { printf(p->adjvex); visited[p->adjvex]=1; stack[++top]=p; p=g[p->adjvex].firstarc;//将p指向与p的邻接点相邻的第一个元素 } } if (top>0) { p=stack[top--]; p=p->next; } //若栈不为空,则退栈并将退栈元素赋给p,使p指向p的下一个邻接点}//[注意] 以上算法适合连通图,若是非连通图,可能有结点未被访问到,则再增加一个主调算法,其核心语句是for (vi=1;vi<=n;vi++) if (!visited[vi]) Traver(g,vi);
(递归)思想:因为每次从顶点依次访问的操作相同,故也可使用递归。
void DFS(ALGraph &G , int v){ ArcNode *p ; if(visited[v]==0) { printf("%c ",G.vertices[v].data); //置访问标志,访问顶点v } visited[v]=1; p=G.vertices[v].firstarc; //链表的第一个结点 while (p!=NULL) { if (!visited[p->adjvex]) { DFS(G, p->adjvex); } //从v的未访问过的邻接顶点出发深度优先搜索p=p->nextarc ; }}
2
应用
应用:(选择题使用)
(1)查找图中的路径
(2)寻找连通分量
(3)判断是否有环
2
广度优先遍历基本思想:广度优先遍历类似于二叉树的层次遍历。首先访问起始顶点v,然后从v出发依次访问v的各个未访问过的邻接顶点 w1,w2,...然后依次访问w1,w2...的所有未被防问过的邻接顶点,再从这些访问过的顶点出发,访问它们所有未被访问过的邻接顶点,直至图中所有顶点都被访问过为止,此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为始点,重复上述过程,直至图中所有顶点都被访问到为止。
利用广度优先遍历访问上图:
第1步:访问初始顶点a第2步:访问与a相邻的结点b、c第3步:访问与b相邻的结点d、e第4步:访问与c相邻的结点f、g第5步:访问与e相邻的结点h访问顺序为:a->b->c->d->e->f->g->h代码实现:思想:图的广度优先遍历算法是树的层次遍历的扩展,该算法使用了两个函数,一个是广度优先遍历图,一个是广度优先遍历的详细遍历过程。与二叉树的层次遍历类似,详细实现时需要借用一个辅助队列存放每一层的元素,访问其子结点时使用。
bool visited[MAX VERTEX NUM]; //访问标记数组 void BFSTraverse (Graph G) { for (i=O ; i visited[i]=FALSE; //访问标记数组初始化 InitQueue(Q) ; //初始化辅助队列 for (i=0; i if (! visited [i]) //对每个连通分量调用BFS BFS(G ,i); //vi未被访问过,从vi开始BFSvoid BFS (Graph G, int v ){ //从顶点出发广度优先遍历图 visit(v); //访问初始顶点 visited [v] =TRUE ; //将访问过的顶点做标记 Enqueue( v) //顶点入队列 while ( ! isEmpty (Q)) { DeQueue (Q, v ); //顶点出队列 for (w=FirstNeighbor(G,v) ;w>=0; w=NextNeighbor(G,v,w)) {//检测所有v的邻接点 if (! visited [w] ) { //w为v尚未被访问过的邻接点 visit (w); //访问顶点 visited[w ]=TRUE ;//对已访问的顶点做标记 EnQueue (Q, w) ; //将顶点w入队列 } } }}
应用:(选择题使用)
(1)查找最短路径
(2)求任意两顶点间的最短路径
c++ stack 遍历_划重点啦!带你解读图的两种遍历方式相关推荐
- c++层次遍历_数据结构与算法,弄懂图的两种遍历方式
1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则, ...
- lisp遍历表中所有顶点_三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS...
1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则 ...
- 三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS
1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.图的遍历.遍历过程中得到的顶点序列称为图遍历序列. 2 深度优先搜索 2.1 算法思想 ...
- 有向图的广度优先遍历_图的两种遍历方式
1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则,依次访 ...
- 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法:三十张图弄懂「图的两种遍历方式」...
原创: 进击的HelloWorld1 引言遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点 ...
- 深度优先遍历访问的边集合_数据结构与算法: 三十张图弄懂「图的两种遍历方式」...
1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则,依次访 ...
- 图和两种遍历,Saving James Bond
图可以作为表示指定环境内所有对象的关系的形式.树可以认为是图的子集,图中节点的联系可能是成环的. 图的元素包括边和点,按照不同的需要可能侧重表达点之间的关系或者点本身的信息. int graph[10 ...
- 【❗划重点!C语言函数参数传递只有两种方式(值传递,地址传递),不支持“引用传递”!❗】
引子 上篇文章<C语言函数传参の结构体数组篇>提到了C语言的函数参数传递方式,百度了一一一大圈,有说两种的,也有说三种的,简直把我搞晕了,"值传递和地址传递"是毫无疑问 ...
- 图的两种遍历算法——BFS和DFS
一.BFS,也称广度优先搜索,和二叉树的层次遍历算法类似 //BFS bool visited[MaxVertexNum]; void BFSTraverse(Graph G){for(i=0;i&l ...
最新文章
- xgboost重要参数2为主但不全要参照1
- (C++)字符数组的四种输入输出方式
- CentOS 6.x使用yum快速安装MySQL 5.5
- stl string常用函数
- 论IP地址在数据库中应该用何种形式存储
- 科幻画图片大全浇水机器人_从机器人到智能机器人,谭建荣院士为温肯师生揭秘新科技...
- Dubbo源码-从HelloWorld开始
- KMP模式串匹配+Compress Words CodeForces - 1200E
- 443. 压缩字符串
- debian8.8安装谷歌浏览器
- Delphi XE7 用indy开发微信公众平台(3)- 验证消息真实性
- CSDN博客如何转载
- XML 数据挖掘 之 挖掘 XML 关联规则
- 广工大第12届ACM校赛A
- 网游中的网络编程系列1:UDP vs. TCP
- Android虚拟机Dalvik介绍
- 凸优化第八章几何问题 8.6 分类
- pymysql executemany()函数
- android引用X5内核webview部分问题记录
- 计算机考研的初试和复试的区别,考研初试和复试之间的区别