深度优先遍历

深度优先遍历(Depth-First Search)

类似于对树的先序遍历

 

 

遍历规则:首先访问初始点v,并将其标记为已访问过,然后从vi 的任一未被访问过的邻接点(有向图的入边邻接点除外,下同)w出发进行深度优先遍历,当vi的所有邻接点均被访问过时,则回退到已被访问的顶点序列中最后一个拥有未被访问的邻接点的顶点vk,从vk的未被访问过的邻接点出发进行深度优先遍历,直到回退到初始点并且没有未被访问的邻接点未知。

 

图的深度优先遍历的过程是递归的,从初始点vi出发递归地深度优先遍历图的算法思想为:

(1)访问顶点vi,并将其编辑为已访问;

(2)取vi的第一个邻接点并赋予值给w;

(3)如果w存在,重复执行步骤①和②:

    ① 如果w未被访问,则从顶点w出发进行深度优先遍历;

    ② 取vi的下一个邻接点并赋予值给w。

1.邻接矩阵储存结构下的深度优先遍历

[cpp]  view plain copy
  1. void DFSTraverse_M(MGraph G, int i, void Visit(VertexType) )  
  2. {  
  3.     //从顶点vi出发递归地深度优先遍历由邻接表表示的图G  
  4.     int w;  
  5.     visited[i] = true;                     //设置访问标志为已访问  
  6.     Visit( GetVex_M(G,i) );                //访问顶点vi  
  7.   
  8.     //从顶点i的第1个邻接顶点w开始  
  9.     for(w=FirstAdjVex_M(G,i); w>=0; w=NextAdjVex_M(G,i,w) )  
  10.         if( !visited[w] )              //如果邻接顶点尚未被访问  
  11.             DFSTraverse_M(G,w,Visit); //递归调用DFSTraverse_M  
  12. }//DFSTraverse_M  

2.邻接表存储结构下的深度优先遍历

[cpp]  view plain copy
  1. void DFSTraverse_AL(ALGraph G, int i, void Visit(VertexType) )  
  2. {  
  3.     //从顶点vi出发递归地深度优先遍历由邻接表表示的图G  
  4.     ArcNode *p;                            //p指向表结点  
  5.     visited[i] = true;                     //设置访问标志为已访问  
  6.     Visit( G.vertices[i].data );           //访问顶点vi  
  7.   
  8.     //p依次指向i的邻接顶点  
  9.     for(p=G.vertices[i].firstarc; p; p=p->next )  
  10.         if( !visited[p->adjvex] )              //如果邻接顶点尚未被访问  
  11.             DFSTraverse_AL(G,p->adjvex,Visit); //递归调用DFSTraverse_AL  
  12. }//DFSTraverse_AL  


 本文转自:http://blog.youkuaiyun.com/junaszxaz1/article/details/6381582

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值