图的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); //初始遍历为第一层
}
}
}