图的深度优先遍历
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6 ,
v7
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6 ,
v7
v2
v2
v8
v2
v8
v8 ,
v3
v7 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6 ,
v7
v2
v2
v8
v2
v8
v8 ,
v3
v7
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4
v5
v2
v2
v8
v8
v3
v3
v7
v6
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
v2
v8
v8
v3
v3
v7
v6
v4
v5
0
v1 ,
1 v1
v2
v3
v3
v2
v2
v8
v8
v3
v3
v7
v6
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4
v5
v2
v2
v8
v8
v3
v3
v7
v6
v4
v5
0
v1 ,Байду номын сангаас
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v5
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6 ,
v7
v2
v2
v8
v2
v8
v8 ,
v3
v7 ,
v3
v3
v7
v6
v4
v5 ,
v3
v6
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
Visited[v]=True;cout<<v; For(v的每一个邻接点w) {
If(visited[w]==false)//如果没有被访问过
DFS(G,w)
}
}
3.算法实现
当图的存储结构为邻接表时,深度优先算法可以表示如下: bool visited[100]={false}; void DFS(ALGraph mg,int v) { visited[v]=true;//以前未被访问,此处被访问 //改变对应的标志为已经访问 cout<<mg.vexs[v].data<<" "; //访问结点v for(int w=FirstAdjVex(mg,v);w>0;w=NextAdjVex(mg,v,w)) {//对于v的每一个邻接点进行考察 if(visited[w]==false)//当该结点未被访问时 DFS(mg,w);//进行深度优先遍历 } }
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
v2
v8
v2
v8
v8 ,
v3
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6 ,
v7
v2
v2
v8
v2
v8
v8 ,
v3
v7 ,
v3
v3
v7
v6
v4
v5 ,
v3
v6
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v3
v3
v7
v6
v4
v5 ,
v3
v6
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6 ,
v7
v2
v2
v8
v2
v8
v8 ,
v3
v7 ,
v3
v3
v7
v6
v4
v5 ,
v3
v6
v2
v8
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6 ,
v7
v2
v2
v8
v2
v8
v8 ,
v3
v7 ,
v3
v3
v7
v6
v4
v5 ,
v3
v6
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
v6
v2
v8
v4
v5
演示结束
3.算法实现
从演示过程可以看出,我们必须知道顶点是否 已经被访问过。在具体实现时,我们用一个全局 数组visited[]来记录顶点是否被访问过。如果 visited[i]的值为True,则顶点vi已经被访问,否 则没有被访问。
3.算法实现
Void DFS(Graph G,int v) {
v3
v7 ,
v3
v3
v7
v6
v4
v5 ,
v3
v6
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6 ,
v7
v2
v2
v8
v2
v8
v8 ,
v3
v7 ,
v3
v3
v7
v6
v4
v5 ,
v3
v4 ,
v5
v2
v2
v8
v2
v8
v8
v3
v3
v7
v6
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
① 访问v ② 分别深度优先遍历v的各个未被 访问的邻接点
2.算法演示
例图及其邻接表表示
0
1 v1 v2 v3
v1
2 v2
v3
v1
v1
v4
v6
v5
v7
v2
3 V3 4 V4
v2
v2
v8
v8
v4
v5
v6
v7
5 v5 6 v6 7 v7 8 v8
v8
v3
v3
v7
v6
v4
v5
演示开始,以v1为遍历的起点
v7
v2
v2
v8
v2
v8
v8 ,
v3
v7 ,
v3
v3
v7
v6
v4
v5 ,
v3
v6
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6 ,
v7
v2
v2
v8
v2
v8
v8 ,
v3
v7 ,
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
v2
v8
v2
v8
v8
v3
v3
v7
v6
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v5
v1
v6 ,
v7
v2
v2
v8
v2
v8
v8 ,
v3
v7 ,
v3
v3
v7
v6
v4
v5 ,
v3
v6
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6 ,
v7
v2
v2
v8
v2
v8
v8 ,
0
v1
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2
v2
v8
v8
v3
v3
v7
v6
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2
v2
v8
v8
v3
v3
v7
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6 ,
v7
v2
v2
v8
v2
v8
v8 ,
v3
v7
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
v5
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6
v7
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3 ,
v1
v4 ,
v5
v1
v6
v7
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
v3
v1
v4 ,
v5
v2
v2
v8
v2
v8
v8 ,
v3
v3
v7
v6
v4
v5 ,
v2
v8
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
v6
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2
v3
v2
v2
v8
v8
v3
v3
v7
v6
v4
v5
0
v1 ,
1 v1
v2
v3
2 v2 3 V3 4 V4
5 v5 6 v6 7 v7 8 v8
v1
v1
v4
v6
v5
v7
v2 ,
7.3图的遍历
回顾其他数据结构的遍历: • 顺序表的遍历 • 单链表的遍历 • 二叉树的遍历 展望: 那么对于图,我们怎样进行遍历呢? • 图的深度优先遍历 • 图的广度优先遍历 这两个算法是后面拓扑排序、求关键路径算法的基础
7.3.1.连通图的深度优先遍历
算法描述:
1.深度优先遍历以v开始的连通图