图的遍历之DFS算法

   图的遍历即从其中的一个顶点出发,沿着一些边访问图中所有的顶点,且每个顶点只访问一次。图的遍历可以通过两种方法来实现:即深度优先搜索(Deth First Search)和广度优先搜索(Breadth First Search).这两种方法基于不同的思想,先来介绍DFS的思想。

   深度优先搜索是一种递归的过程,有回退。

1:对于一个无向连通图而言,在访问图中的某一起始顶点V后,由V出发,访问它的某一个邻接顶点W1;

2:再从W1出发,进行类似1的访问……直至访问到wi,而Wi正好无节点访问时暂停。

3:接着,回退一步至前一次被访问的节点Wi-1,看是否有其他未被访问过的邻接结点,若果有再重复步骤2,否则在回退。

4,重复上述过程,直至该连通图中所有顶点都被访问过为止。

DFS算法的实现:

在实现DFS(v)函数中,实现从顶点v出发访问它所有未访问过的邻接结点需要在DFS算法中设置一个visited[n]的标记数组来存储和标记各顶点的访问状态,设visited[i]=1,表示顶点i被访问过;visited[i]=0,则表示顶点i还未被访问。初始化visited[n]={0};

若图是用邻接表存储的,则实现如下:

DFS(顶点i)  //从顶点i进行深度优先搜索
{
    visited[i]=1;  //将顶点i的访问标志置为1
    p=顶点i的边链表表头指针;
    while(p不为空)
    {
        //设指针p所指向的边结点所表示的边中,另一个顶点为顶点j
        if(j未被访问过)
        {
            //递归搜索前的准备工作;
            DFS(顶点j);
            //以下是DFS回退的位置;
        }
        p=p->nextarc; //p移向下一个边结点
    }
}

若图是用邻接矩阵存储的,则实现如下:

DFS(顶点i)  //从顶点i进行深度优先搜索
{
    visited[i]=1;  //将顶点i的访问标志置为1
    for(int j=0;j<n;j++)  //对其它所有顶点j
    {
        //j是i的邻接顶点,且顶点j没有被访问过
        if(Edge[i][j]==1&&!visited[j])
            {
                //递归搜索前的准备工作;
                DFS(j);
                //DFS的回退位置;
            }
    }
}
    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/pursue_success/article/details/50682422
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞