图的遍历深度遍历和广度遍历

图的深度遍历(类似于树的先跟遍历)

设初始状态图中所有的结点都没有遍历过。

深度遍历可以从某个顶点v出发,访问v顶点,然后依次从v的未访问的邻接顶点出发深度遍历图,直到图中所有和v有路径相通的顶点都被访问过。

伪代码如下:(运用的是邻接表存储)

DFS(Graph G,int v)
 1 void DFS(Graph G ,int v){
2
3 visited[v]=true;VisitFunction(v);
4
5 for(w = FirstAdjVex(G,v);w;w=NextAdjVex(G,v,w)){
6
7 if(!visited[w]) DFS(G,w);
8
9 }
10
11 }

在推广下,上面的深度遍历是建立在所给的图为连通图,如果所给的图不连通,那么算法得加上下面的代码:

View Code
1 for(v=0;v<G.vexnum;v++){
2
3 if(!visited[v]) DFS(G,v);
4
5 }

也就是说只要将每个没有被访问的顶点都进行一次深度遍历即可。

----------------------------------------------------------------我是分割线----------------------------------------------------------------------------------------------

图的广度遍历(类似于树的层次遍历)

同样设初始状态图中所有的结点都没有遍历过

由于同树的层次遍历类似因此需要一个队列来保存跟的所有孩子。

算法如下:

假设从图中的某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发访问他们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至所有顶点都被访问。

换句话说 广度优先遍历的过程是:以v为起始点,由近到远,依次访问和v由路径相连通且路径长度为1,2,.....的顶点。

伪代码如下:(运用的是邻接表存储)

BFS(Graph G,int v)
 1 void BFS(Graph G,int v){
2
3/*初始化visited数组*/
4
5 ​ EnQueue(Q,v);
6
7while(!QueueEmpty()){
8
9 ​ ​ DeQueue(Q,u);
10
11 ​ ​ visited[u]=true; VisitFunction(u);
12
13 ​ ​ //将u结点的所有没有被访问的邻接点都进队列
14
15 ​ ​ for(w = FirstAdjVex(G,v);w;w=NextAdjVex(G,v,w)){
16
17 ​ ​ ​ if(!visited[w]) EnQueue(w);
18
19 ​ ​ }
20
21 ​ }
22
23 }

同理上面只针对连通图,对于非连通图要加上下面的代码

View Code
1 for(v=0;v<G.vexnum;v++){
2
3if(!visited[v]) BFS(G,v);
4
5 }

原文地址:https://www.cnblogs.com/hankskfc/p/2192843.html