数据结构—深度优先遍历广度优先遍历图遍历算法的应用

Posted 之墨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构—深度优先遍历广度优先遍历图遍历算法的应用相关的知识,希望对你有一定的参考价值。

深度优先遍历

深度优先遍历的过程是从图中的某个初始点v出发,首先访问初始点v
然后选择一个与顶点v相邻且没被访问过的顶点w
w为初始顶点,再从它出发进行深度优先遍历
直到图中与顶点v邻接的所有顶点都被访问过为止
显然这个遍历过程是一个递归过程
以邻接表为存储结构的深度优先遍历算法如下
(其中v是初始点,visited 是一个全局数组,初始时所有元素均为0,表示所有顶点尚未被访问过)

代码实现

int visited[Max] = 0;
void DFS(AdjGraph *G,int v)
///深度优先遍历
    ArcNode *p;
    visited[v] = 1;
    cout<<v;
    p = G->adjList[v].firstArc;
    while(p != NULL)
    
        if(visited[p->adjvex] == 0)
            DFS(G,p->adjvex);
        p = p->nextarc;
    

对于具有 n 个顶点、e条边的有向图或无向图,DFS算法对图中的每个顶点最多调用一次,因此其递归调用总次数为n
当访问某个顶点v时,DFS的时间主要花在从该顶点出发查找它的邻接点上
当采用邻接表表示图时,需要遍历该顶点的所有邻接点,所以DFS的总时间为 O(n+e)
当采用邻接矩阵表示图时,需要遍历该顶点行的所有元素,所以DFS 的总时间为 O(n²)

广度优先遍历

广度优先遍历的过程是首先访问初始点 v
接着访问顶点v的所有未被访问过的邻接点v1 v2 ...vt
然后再按照v1 v2 ...vt 的次序访问每一个顶点的所有未被访问过的邻接点
依此类推,直到图中所有和初始点ν有路径相通的顶点都被访问过为止
以邻接表为存储结构,在用广度优先遍历图时需要使用一个队列
这里采用环形队列,以类似于二叉树的层次遍历方式来遍历图
对应的算法如下(其中,ν是初始点)

代码实现

void BFS(AdjGraph *G,int v)
///广度优先遍历
    int w,i;
    ArcNode *p;
    queue<int> q;
    int visited[MAX];
    for(i = 0;i<G->n;i++)
        visited[i] = 0;
    cout<<v;
    visited[v] = 1;
    q.push(v);
    while(!q.empty())
    
        q.push(w);
        p = G->adjList[w].firstArc;
        while(p != NULL)
        
            if(visited[p->adjvex] == 0)
            
                cout<<p->adjvex;
                visited[p->adjvex]  =1;
                q.push(p->adjvex);
            
            p = p->nextarc;
        
    
    cout<<endl;

显然,对于具有 n 个顶点、e条边的有向图或无向图
BFS 算法中每个顶点都进队一次
因此执行时间与 DFS相同 当图采用邻接表表示图时,BFS 的总时间为 O(n+e)
当图采用邻接矩阵表示图时,BFS 的总时间为 O(n²)

遍历算法的应用

假设图 G采用邻接表存储,设计一个算法输出图 G 中从顶点u 到σ的一条简单路径(假设图 G 中从顶点u到ν至少有一条简单路径)

采用深度优先遍历的方法
从顶点 u 出发找到顶点v的一条路径的过程
为此在深度优先遍历算法的基础上增加 v、path 和d 几个形参
其中 path 存放顶点u到v的路径,d 表示 path 中的路径长度,其初值为一1
当从顶点u遍历到顶点v后,输出path 并返回

代码实现

void OneSimplePath(AdjGraph *G,int u,int v,int path[],int d)
///简单路径
    int w,i;
    ArcNode *p;
    visited[u] =1;
    d++;
    path[d] = u;
    if(u == v)
    
        for(i = 0;i<=d;i++)
            cout<<path[i];
        cout<<endl;
        return;
    
    p = G->adjList[u].firstArc;
    while(p != NULL)
    
        w= p->adjvex;
        if(visited[w] == 0)
            OneSimplePath(G,w,v,path,d);
        p = p->nextarc;
    

以上是关于数据结构—深度优先遍历广度优先遍历图遍历算法的应用的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法图遍历算法 ( 深度优先搜索 DFS | 深度优先搜索和广度优先搜索 | 深度优先搜索基本思想 | 深度优先搜索算法步骤 | 深度优先搜索理论示例 )

数据结构—— 图:图的遍历

图的深度/广度优先遍历C语言程序

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)

图的广度遍历和深度遍历

图的遍历:深度优先遍历,广度优先遍历