图的邻接矩阵和邻接表存储的深度优先遍历(DFS)算法实现

图的DFS遍历

图的深度优先遍历算法,重点在深度。它的意思表示为每次沿着一条路径一直往下走,一直到不能再前进为止(当前顶点没有邻接点或者所有邻接点如果存在的话都被访问过了),然后退回到最近的岔道口,沿着另一个未被访问过的路径走下去。

本文默认读者已经掌握了图的相关概念,此外邻接表的实现笔者使用的是vector数组

1. 图以邻接矩阵作为存储方式
直接上代码了,我做了清楚的注释。

const int maxn=100;               //最大顶点数 
const int INF=10000000;           //定义一个极大数 用此代表两顶点之间没有边的存在。当让也可以用零表示,在输入的时候,没有边的就输入零
//使用邻接矩阵实现的图,深度优先遍历算法。
int graph[maxn][maxn],vexnum;       //graph数组用与存储顶点标号(用数组下标)之间是否由边存在 ,vexnum顶点数目 
bool flag[maxn]={false};             //标记数组,用于标记该顶点是否已经被访问过了 
void DFS1(int u,int depth){           //递归 
    printf("%d ",u);        //访问顶点u,此处可以实现对图结点的相关判定和操作
    flag[u]=true;           //访问标记置为true 
    for(int i=0;i<vexnum;i++){              
        if(!flag[i]&&graph[u][i]!=INF){       //如果i顶点没有被访问过,并且u和i之间存在边 
            DFS1(i,depth+1);         //递归访问 
        }
    } 
} 
void DFSvisit1(){            //访问该图所有的连通分量 
    for(int i=0;i<vexnum;i++){
        if(!flag[i]){        //如果顶点i未被访问过 
            DFS1(i,1);        //递归遍历u和u所在的联通块。 
        }
    }
}

2. 图以邻接表作为存储方式

//使用邻接表存储的图(使用的vector数组实现邻接表)。
vector<int> adj[maxn];         //定义邻接表数组 
void DFS2(int u,int depth){
    printf("%d ",u);
    /*此处除了输出顶点外,还可以对u进行相应的操作*/
    flag[u]=true;            //将标记置为true。 
    for(int i=0;i<adj[i].size();i++){    //对顶点u的邻接表进行遍历 
        int v=adj[u][i];      //v等于当前u的邻接表中被处理的结点 
        if(!flag[v]){         //如果没有被访问过 
            DFS2(v,depth+1);  //递归深度遍历 
        }
    }
}
void DFSvisit2(){         //访问图所有的连通块 
    for(int i=0;i<vexnum;i++){
        if(!flag[i]){
            DFS2(i,1);    //初始遍历为第一层 
        }
    } 
} 
    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/LITTENg/article/details/79476022
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞