【图论课件】第二课时·图的遍历
- 格式:pdf
- 大小:680.02 KB
- 文档页数:27
inputt.close();
}
}
三、实验结果:
1.输入图
2. 遍历图:(先深度,后广度)
四、结果分析:
数据结构顾名思义讲求的是一种存储结构,一路走来先后学习了表、树,最后学习的是图,对于每种存储结构学习之初都会学习一些基本操作,而操作之中又以创建和遍历为最基本的操作,只有熟练掌握了以后才能对其他操作进行研究和学习。
在这次实验中,我也得到了很多收获,比如链表的应用,以前弄不太明白,通过这次实验,在链表这一方面我懂了很多,虽然还不能运用自如,但在这次实验中,对本学期所学习的内容也是一次巩固,让我加深了对学过知识的记忆。
总之,这次实验让我既发现了自身的很多不足,又增长了很多知识。
数据结构与算法分析第1111章章 图图1图的遍历许多应用需要对图中的每个结点恰好访问一次.基于图的拓扑结构,以特定顺序依次访问图中各个顶点是很有用的.例如:–人工智能搜索–最短路径问题24图的遍历(2)为了保证访问所有顶点:void void graphTraverse(const graphTraverse(const graphTraverse(const Graph Graph Graph** G) { for (v=0; v<G->n(); v++) G-> G->setMark(v setMark(v setMark(v, UNVISITED); // Initialize , UNVISITED); // Initialize for (v=0; v<G->n(); v++) if (G-> if (G->getMark(v getMark(v getMark(v) == UNVISITED)) == UNVISITED) doTraverse(G doTraverse(G doTraverse(G, v);, v);}从图中某个顶点V0 出发,访问此顶点,然后依次从V的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到。
一、深度优先搜索遍历图连通图的深度优先搜索遍历5从上页的图解可见:1. 从深度优先搜索遍历连通图的过程类似于树的先根遍历;2. 如何判别V的邻接点是否被访问?解决的办法是:为每个顶点设立一个“访问标志”。
78深度优先搜索(2)Cost: Θ(|V | + |E |).9深度优先搜索 DFS(1)// // Depth first search Depth first search void DFS(Graph void DFS(Graph** G, G, int int int v) { v) { PreVisit(G PreVisit(G PreVisit(G, v); // Take action , v); // Take action G->G->setMark(v setMark(v setMark(v, VISITED);, VISITED); for ( for (int int int w=G->first(v); w<G->n();w=G->first(v); w<G->n(); w = G->next(v,w)) if (G-> if (G->getMark(w getMark(w getMark(w) == UNVISITED)) == UNVISITED) DFS(G, w); PostVisit(G PostVisit(G PostVisit(G, v); // Take action , v); // Take action }非连通图的深度优先搜索遍历首先将图中每个顶点的访问标志设为 FALSE, 之后搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一顶点。
第7章图(2)图的遍历 主讲:刘春学习目标① 掌握图的基本概念,包括图、有向图、无向图、完全图、 子图连通图、度、入度、初度、简单回路和环等基本概念 的定义。
② 重点掌握图的各种存储结构、包括邻接矩阵和邻接表等 ③ 重点掌握图的基本元素、包括创建图、输出图、深度优先 遍历、广度优先遍历算法等 ④ 掌握图的其他运算、包括最小生成树、最短路径、拓扑排 序和关键路径等算法 ⑤ 灵活运用图这种数据结构解决 灵活运用图这种数据结构解决一些综合应用问题 些综合应用问题。
7.3 图的遍历图的遍历的定义 从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中 的每个顶点仅被访问一次的过程。
1 2 4 5 6 3 7问题:图中可能存在回路,且图的任一顶点都 可能与其它顶点相通 在访问完某个顶点之后 可能与其它顶点相通,在访问完某个顶点之后 可能会沿着某些边又回到了曾经访问过的顶点。
为了避免重复访问,可设置一个标志辅助数组 visited[ ],它的初始状态为 0,在图的遍历过程 中,一旦某一个顶点 i 被访问,就立即让 visited[i]为 1,防止它被多次访问。
防止它被多次访问8根据搜索方法的不同,图的遍历有两种: 深度优先搜索(DFS)和广度优先搜素(WFS)。
7.3 图的遍历深度优先搜索( (Depth p _First Search) )主要思想:从图中某个顶点V0 出发,访问此顶点,然后选择一个 与V0邻接且未被访问的顶点W为初始顶点,再从W出发进行深度优 先搜索, 直至图中所有和V0有路径相通的顶点都被访问到; 若此时图中尚有顶点未被访问 则另选图中 个未曾被访问的顶点 若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点 作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。
深度优先搜索是个递归的过程7.3 图的遍历连通图DFS的具体搜索过程: 在访问图中任意选某一起始顶点 v 后,由 v 出发,访问它的任一 邻接顶点 w1;再从 w1 出发,访问与 w1邻 接但还没有访问过的顶点 w2;然后再从 w2 出发,进行类似的访问,… 如此进行下去,直至 到达所有的邻接顶点都被访问过的顶点 u 为止。
5.3 图的遍历和树的遍历类似,在此,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。
这一过程就叫做图的遍历(TraversingGraph)。
图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。
然而,图的遍历要比树的遍历复杂得多。
因为图的任一顶点都可能和其余的顶点相邻接。
所以在访问了某个顶点之后,可能沿着某条路径搜索之后,又回到该顶点上。
[例如]图7.1(b)中的G2,由于图中存在回路,因此在访问了v1,v2,v3,v4之后,沿着边(v4 , v1)又可访问到v1。
为了避免同一顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点。
为此,我们可以设一个辅助数组visited[0..n-1],它的初始值置为“假”或者零,一旦访问了顶点vi,便置visited[i]为“真”或者为被访问时的次序号。
通常有两条遍历图的路径:深度优先搜索和广度优先搜索。
它们对无向图和有向图都适用。
5.3.1 深度优先搜索深度优先搜索(Depth-First Search)遍历类似于树的先根遍历,是树的先根遍历的推广。
其基本思想如下:假定以图中某个顶点vi为出发点,首先访问出发点,然后选择一个vi的未访问过的邻接点vj,以vj为新的出发点继续进行深度优先搜索,直至图中所有顶点都被访问过。
显然,这是一个递归的搜索过程。
现以图5-3-1中G为例说明深度优先搜索过程。
假定v0是出发点,首先访问v0。
因v0有两个邻接点v1、v2均末被访问过,可以选择v1作为新的出发点,访问v1之后,再找v1的末访问过的邻接点。
同v1邻接的有v0、v3和v4,其中v0已被访问过,而v3、v4尚未被访问过,可以选择v3作为新的出发点。
重复上述搜索过程,继续依次访问v7、v4 。
访问v4之后,由于与v4相邻的顶点均已被访问过,搜索退回到v7。
由于v7、v3和v1都是没有末被访问的邻接点,所以搜索过程连续地从v7退回到v3,再退回v1,最后退回到v0。