DFS深度优先遍历算法详解与实现

DFS深度优先遍历算法详解与实现

概括:深度优先是沿着一条路一直走到底,然后进行回溯

该算法是基于图的邻接表存储实现的

图的邻接表存储方式

注意,邻接表中边表节点中存储的值是该节点在数组中的索引值,而顶点表节点存储的是数据

更多关于邻接表内容:

https://blog.csdn.net/ASCIIdragon/article/details/84635236

 

使用一个一维数组visited标记访问过的顶点,对应的下标的元素为1(代表已经被访问),0(代表没有被访问)

step1:

v 是第一个需要访问的顶点在顶点表中的索引值,注意,是索引值。假设v = 0,则将visited[0]标为1.

step2:

p是指向顶点表[v]的邻接点指针。p = vertices[v].firstarc.

注意,p不是从p = vertices[v]开始的,而是从某顶点的邻接点。p = vertices[v].firstarc.

step3:

判断p是否为空

不为空,则v  = p->adjvex节点可以访问,递归到step1,将visited[1] = 1

 

然后继续访问v的邻接点,p = vertices[v].firstarc

如果p不为空,则v  = p->adjvex节点也访问过了,visited[2] = 1

然后继续访问v的邻接点,p = vertices[v].firstarc

此时vertices[4].first为空,则p指向上一次访问的顶点

然后执行step3,step1,step2,step3......

程序不断重复执行step1,step2,step3,可以用递归的方式实现。

 

c语言实现代码

//访问标志数组
int visited[MAX] = {0};

//用邻接表方式实现深度优先搜索(递归方式)
//v 传入的是第一个需要访问的顶点索引值
void DFS(MGraph G, int v)
{
    //图的顶点的搜索指针
    ArcNode *p;
    //置已访问标记
    visited[v] = 1;
    //输出被访问顶点的编号
    printf("%d  ", v);
    //p指向顶点v的第一条弧的弧头结点
    p = G.vertices[v].firstarc;
    while (p != NULL)
    {
        //若p->adjvex顶点未访问,递归访问它
        if (visited[p->adjvex] == 0)
        {
            DFS(G, p->adjvex);
        }
        //p指向顶点v的下一条弧的弧头结点
        p = p->nextarc;
    }
}

参考博客:

https://www.cnblogs.com/kubixuesheng/p/4399705.html

https://www.cnblogs.com/kubixuesheng/p/4399705.html(堆栈)

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值