DFS深度优先遍历算法详解与实现
概括:深度优先是沿着一条路一直走到底,然后进行回溯
该算法是基于图的邻接表存储实现的
图的邻接表存储方式
注意,邻接表中边表节点中存储的值是该节点在数组中的索引值,而顶点表节点存储的是数据。
更多关于邻接表内容:
https://blog.youkuaiyun.com/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;
}
}
参考博客: