深度优先遍历(Depth-First Search)
类似于对树的先序遍历
遍历规则:首先访问初始点vi ,并将其标记为已访问过,然后从vi 的任一未被访问过的邻接点(有向图的入边邻接点除外,下同)w出发进行深度优先遍历,当vi的所有邻接点均被访问过时,则回退到已被访问的顶点序列中最后一个拥有未被访问的邻接点的顶点vk,从vk的未被访问过的邻接点出发进行深度优先遍历,直到回退到初始点并且没有未被访问的邻接点未知。
图的深度优先遍历的过程是递归的,从初始点vi出发递归地深度优先遍历图的算法思想为:
(1)访问顶点vi,并将其编辑为已访问;
(2)取vi的第一个邻接点并赋予值给w;
(3)如果w存在,重复执行步骤①和②:
① 如果w未被访问,则从顶点w出发进行深度优先遍历;
② 取vi的下一个邻接点并赋予值给w。
1.邻接矩阵储存结构下的深度优先遍历
- void DFSTraverse_M(MGraph G, int i, void Visit(VertexType) )
- {
- //从顶点vi出发递归地深度优先遍历由邻接表表示的图G
- int w;
- visited[i] = true; //设置访问标志为已访问
- Visit( GetVex_M(G,i) ); //访问顶点vi
- //从顶点i的第1个邻接顶点w开始
- for(w=FirstAdjVex_M(G,i); w>=0; w=NextAdjVex_M(G,i,w) )
- if( !visited[w] ) //如果邻接顶点尚未被访问
- DFSTraverse_M(G,w,Visit); //递归调用DFSTraverse_M
- }//DFSTraverse_M
2.邻接表存储结构下的深度优先遍历
- void DFSTraverse_AL(ALGraph G, int i, void Visit(VertexType) )
- {
- //从顶点vi出发递归地深度优先遍历由邻接表表示的图G
- ArcNode *p; //p指向表结点
- visited[i] = true; //设置访问标志为已访问
- Visit( G.vertices[i].data ); //访问顶点vi
- //p依次指向i的邻接顶点
- for(p=G.vertices[i].firstarc; p; p=p->next )
- if( !visited[p->adjvex] ) //如果邻接顶点尚未被访问
- DFSTraverse_AL(G,p->adjvex,Visit); //递归调用DFSTraverse_AL
- }//DFSTraverse_AL
本文转自:http://blog.youkuaiyun.com/junaszxaz1/article/details/6381582