Index
题目
设计函数实现对图的深度优先遍历。
分析实现
类似于图的BFS的分析思路,图的DFS和二叉树的DFS思路相同,但需要额外考虑结点是否已经被访问过。
此处同样用布尔数组visited
来记录每个结点的访问情况,对于邻接矩阵存储方式的图的DFS,依照先序遍历思想实现的对应函数如下:
// 图的结构体的定义
struct Graph{
int vexnum;
vector<vector<int>> edge;
};
// DFS辅助函数: cur-当前节点 visited-访问标记数组
void DFSUtil(Graph& G, int cur, vector<bool>& visited){
visit(G, cur);
visited[cur] = true;
for(int i = 0; i < G.vexnum; i++){
if(G.edge[cur][i] == 1 && !visited[i])
DFSUtil(G, i, visited);
}
}
// DFS遍历: v-起始节点
void DFS(Graph& G, int v){
vector<bool> visited(G.vexnum, false);
DFSUtil(G, v, visited);
}
总结
以上就是通过辅助递归函数完成的图的DFS的实现。
此处因为涉及到递归,不能直接像BFS那样新建visited
数组,否则每次递归都会独立创建一个visited
数组。为此,设计了辅助函数来实现目标效果。