图的遍历------深度遍历和广度遍历
图的深度遍历(类似于树的先跟遍历)
设初始状态图中所有的结点都没有遍历过。
深度遍历可以从某个顶点v出发,访问v顶点,然后依次从v的未访问的邻接顶点出发深度遍历图,直到图中所有和v有路径相通的顶点都被访问过。
伪代码如下:(运用的是邻接表存储)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
在推广下,上面的深度遍历是建立在所给的图为连通图,如果所给的图不连通,那么算法得加上下面的代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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,.....的顶点。
伪代码如下:(运用的是邻接表存储)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 void BFS(Graph G,int v){
2
3 /*初始化visited数组*/
4
5 EnQueue(Q,v);
6
7 while(!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 }
同理上面只针对连通图,对于非连通图要加上下面的代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 for(v=0;v<G.vexnum;v++){
2
3 if(!visited[v]) BFS(G,v);
4
5 }