当前位置:
文档之家› 数据结构2 图的遍历.ppt
数据结构2 图的遍历.ppt
广度优先搜索
V1
V2
V3
V4
V5
V6
V7
V8
广度遍历序列:
V1 V2 V3 V4 V5 V6 V7 V8
广度优先搜索
V1
V2
V3
V4 V5 V6 V7
V8
广度遍历序列: V1 V2 V3 V4 V6 V7 V8 V5
public void BFS(){ ArrayQueue<Integer> AQueue=new ArrayQueue<Integer>(); for(int i=0;i<vexnum;i++) vertexs[i].visited=false; for(int v=0;v<vexnum;v++) if (vertexs[v].wasVisited==false){ vertexs[v].visited=true; System.out.print(vertexs[v].data+” ” ); AQueue.enQueue(v); while(!AQueue.isEmpty()){ u=AQueue.deQueue(); for(int w=firstAdjVex(u); w>=0; w=nextAdjVex(u,w)) if (vertexs(w).wasVisited==false){ System.out.print(vertexs[w].data+” ” ); vertexs(w).visited=true; AQueue.enQueue(w); } //if }//while }//if
为每个顶点设立一个“访问标志 visited”;
深度优先搜索-连通图
void DFS(int v) { // 从顶点v出发,深度优先搜索遍历连通图 vertexs[v].visited = true;
//对v的尚未访问的邻接顶点w递归调用DFS for(w=firstAdjVex(v); w>=0; w=nextAdjVex(v,w)) if (vertexs[w].visited==false) DFS(w);
} // DFS
V1
V1 DFS(G, V1)
V2 V5 V6 V3
V2
V3
V4
V8
V7
V1
V4
V5
V2
V8
V4
V5
V2
V8
V6 V3
V7 V8
V1
V6
V7
V3
V8
深度优先搜索—非连通图
首先将图中每个顶点的访问标志设为 fasle, 之后搜索图中每个顶点,如果未被访问,则 以该顶点为起始点,进行深度优先搜索遍历, 否则继续检查下一顶点。
SG3 优先搜索历。
深度优先搜索-连通图
V1 V1
V2
V2 V5 V6 V3 V4
V4
V8
V7
深度遍历序列:
V1 V2 V4 V8 V5 V6 V3 V7
V8
V5
V6
V3
V7
深度优先搜索-连通图
1、从深度优先搜索遍历连通图的过程类似于树的先根遍历 2、对图G深度优先搜索得到的顶点序列不是唯一的? 3、搜索过程中经过的边和所有的顶点构成了图的一棵生成树。 4、如何判别V的邻接点是否被访问?
1
2
3
复习-图的存储结构
A
B
E
CD
15 A 9
11
B 7 21
E
3
C2 D
01001 00100 00010 11000 00100
15 9 3 2 11 7 21
复习-图的存储结构
A
B
E
CD
15 A 9
11
B 7 21
E
3
C2 D
0A 1B 2C 3D 4E
0A 1B 2C 3D 4E
分类: 深度优先搜索 广度优先搜索
深度优先搜索
V
w1
w2
SG1
SG2
W1、W2和W3 均为 V 的邻接点,SG1、SG2 w3 和 SG3 分别为含顶点 W1、W2和W3 的子图。
SG3
深度优先搜索
V
w1
w2
SG1
SG2
访问顶点V ;
for (W1、W2、W3 ) w3 若邻接点Wi未被访问,
则从它出发进行深度}例如:来自01a
b
6
g
2
3
4
5
c de f
ab cg h df
7
8
h
k
k
e
012345678
访问标志: FT FT FT FT FT FT FT FT FT
访问次序: a c h d f k e b g
深度优先搜索—非连通图
1.从图中某个顶点V0 出发,访问此顶点。
2.然后依次从V0的各个未被访问的邻接点出发 深度优先搜索遍历图,直至图中所有与V0有路 径的顶点都被访问到。
w6
w5
V->w6, V->w4的路径长度为3。
广度优先搜索
1.从图中的某个顶点V0出发,并在访问此顶点 之后依次访问V0的所有未被访问过的邻接点 2.然后按这些顶点被访问的先后次序依次访问 它们的邻接点,直至图中所有和V0有路径相通 的顶点都被访问到。 3.若此时图中尚有顶点未被访问,则另选图中 一个未曾被访问的顶点作起始点 4.重复上述过程,直至图中所有顶点都被访问 到为止
3.如果图中还有顶点未被访问,则令选一个未 曾被访问的顶点作为起始点,重复上述过程, 直至图中所有顶点都被访问到。
广度优先搜索
对连通图,从起始点V到其余各
w2
顶点必定存在路径。其中,
w1 V
w3
V->w1, V->w2, V->w8 的路 径长度为1;
w7
w8
w4
V->w7, V->w3, V->w5的 路径长度为2;
图的遍历
复习 图的遍历 深度优先搜索 广度优先搜索 课堂练习 图的遍历的应用举例(自学) 小结和作业
复习-图的存储结构
B A
F
C D
E
010010 100011 000101 001001 110000 011100
复习-图的存储结构
B A
F
0A
C
1B
2C D3D
4E
E
5F
1
4
0
4
5
3
5
2
5
0
1
3
0
3
1
4
2
0
1 15 4 9 23 32 0 11 1 7 2 21
复习-图的存储结构
A
0A
1B
B
E 2C
3D CD
4E
3
0
3
1
4
2
0
图的遍历
定义:从图中某个顶点出发游历图,访遍图中其余 顶点,并且使图中的每个顶点仅被访问一次的过程。
用途:是解决图的连通性、拓扑排序和求关键路径 等算法的基础。
深度优先搜索—非连通图
V1
V2
V3
V4 V5 V6 V7
V8
深度遍历:
V1 V2 V4 V8 V3 V6 V7 V5
深度优先搜索—非连通图
void DFSTraverse(int v) { for (v=0; v<vexNum; ++v) vertexs[v].visited = false; // 访问标志数组初始化 for (v=0; v<vexNum; ++v) { if (!vertexs[v].visited) DFS(v); // 对尚未访问的顶点调用DFS }