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

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

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

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

图的邻接表存储方式

DFS深度优先遍历算法详解与实现_第1张图片

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

更多关于邻接表内容:

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.

DFS深度优先遍历算法详解与实现_第2张图片

step3:

判断p是否为空

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

 

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

DFS深度优先遍历算法详解与实现_第3张图片

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

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

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

DFS深度优先遍历算法详解与实现_第4张图片

然后执行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(堆栈)

你可能感兴趣的:(算法)