图的遍历之深度优先搜索(DFS)

1、深度优先遍历的过程

深度优先遍历类似于树的先序遍历,是树的先序遍历的推广。

对于一个连通图,深度优先搜索遍历的过程如下。

(1)从图中某个顶点v出发1,访问v。

(2)找到刚访问过的顶点的第一个未被访问过的邻接点,访问该顶点。以该顶点为新顶点,重

复此步骤,直到刚访问过的顶点没有未被访问的邻接点为止。

(3)返回前一个访问过的且仍有未被访问的邻接点的顶点,找出该顶点的下一个未被访问的

邻接点,访问该顶点。

(4)重复步骤(2)和(3)直到途中所有顶点都被访问过,搜索结束。

2.深度优先遍历的算法实现

显然,深度优先搜索遍历连通图是一个递归的过程。为了在遍历过程中便于区分顶点是否已

被访问,需要附设访问表标志数组visited[n],其初值为“false”,一旦某个顶点被访问,则其相

应的分量置为“true”。

算法描述

bool visited[MVNum]      //访问标准数组,其初值为“false”
void DFS (Graph G,int v)
{//从第v个顶点出发递归地深度优先遍历图G
    cout<<v;visited[v]=true;//访问第v个顶点,并置分量值为true
    for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
    /*依次检查v的所有邻接点w,FirstAdjVex(G,v,w)表示v的第一个邻 
      接点;NextAdjVex(G,v,w)表示v相对于w的下一个邻接点,w>=
       0表示存在邻接点*/
     if(!visited[w])  DFS(G,w);//对v的尚未访问的邻接顶点w递归调用DFS
}

根据存储结构的不同,具体可以分为:

       ①采用邻接矩阵表示图的深度优先搜索遍历

void DFS—AM(AMGraph G, int v)
    {//G为邻接矩阵类型,从第v个顶点出发深度优先搜索遍历图G
      cout<<v;visited[v]=true;//访问第v个顶点,并置访问标志数组相应分量值为true
     for(w=0; W<G. vexnum:w++)//依次检查邻接矩阵v所在的行
         if((G.arcs [v] [w]!=0)&&(!visited[w])) DFS_ AM(G, W);
   //G.arcs[v][w]!=0表示w是v的邻接点,如果w未访问,则递归调用 DFS_AM
}

      ②采用邻接表表示图的深度优先搜索遍历

void DFS_AL(ALGraph G,int v)
{//图G为邻接表类型
  cout<<v;visited[v]=true;//访问第v个顶点,并置为true
  p=G.vertices[v].firstarc;//p指向v的边链表的第一个边结点
  while(p!=NULL)//边结点非空
  {
     w=p->adjvex;      //表示w是v的邻接点
     if(!visited[w]) DFS_AL(G,w);//如果w未访问,递归
     p=p->nextarc;//      p指向下一个边结点3
   }
}

谢谢阅读QAQ

转载于:https://www.cnblogs.com/Knight-Dark-The/p/11057013.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值