C++实现深度优先搜索(Depth-First Search,DFS)算法
以下是用C++实现的深度优先搜索(Depth-First Search,DFS)算法示例:
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
// 图的表示方式为邻接表
class Graph {
public:
unordered_map<int, vector<int>> adjList;
// 向图中添加边
void addEdge(int v, int w) {
adjList[v].push_back(w);
}
// 深度优先搜索的递归辅助函数
void DFSUtil(int v, unordered_set<int>& visited) {
// 将当前节点标记为已访问
visited.insert(v);
cout << v << " ";
// 递归访问所有未访问的邻接节点
for (int neighbor : adjList[v]) {
if (visited.find(neighbor) == visited.end()) {
DFSUtil(neighbor, visited);
}
}
}
// 深度优先搜索的主函数
void DFS(int v) {
unordered_set<int> visited; // 用于跟踪已访问的节点
DFSUtil(v, visited);
}
};
int main() {
Graph g;
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
cout << "从节点 2 开始的深度优先搜索遍历结果: ";
g.DFS(2);
return 0;
}
代码解释:
-
class Graph
:- 使用一个邻接表来表示图,其中
adjList
是一个unordered_map
,键是节点,值是与该节点相邻的节点列表。
- 使用一个邻接表来表示图,其中
-
void addEdge(int v, int w)
:- 向图中添加从节点
v
到节点w
的边。
- 向图中添加从节点
-
void DFSUtil(int v, unordered_set<int>& visited)
:- 递归辅助函数,用于执行实际的DFS。
- 将当前节点
v
标记为已访问并打印。 - 递归访问所有未访问的邻接节点。
-
void DFS(int v)
:- DFS的主函数,初始化一个
unordered_set
来跟踪已访问的节点,并调用DFSUtil
。
- DFS的主函数,初始化一个
-
int main()
:- 创建一个图并添加边。
- 从节点
2
开始执行DFS,并打印遍历结果。
运行结果:
该代码将打印从节点2
开始的DFS遍历顺序。例如,对于上述示例图,输出可能为:
复制代码
从节点 2 开始的深度优先搜索遍历结果: 2 0 1 3
这个输出表示从节点2
开始,按照DFS的顺序访问各个节点。不同的邻接表表示方式可能会导致不同的遍历顺序。