能否提供一个C++实现的深度优先搜索(DFS)算法示例及其详细解释?
时间: 2024-11-03 15:12:47 浏览: 3
当然可以。深度优先搜索(Depth First Search,简称DFS)是一种用于遍历或查找树形结构的算法。以下是C++中基本的递归版DFS的实现:
```cpp
#include <iostream>
#include <vector>
// 定义图的邻接列表表示
using namespace std;
class Graph {
private:
vector<vector<int>> adj; // 存储邻接表
public:
Graph(int v) { adj.resize(v); } // 初始化图,每个顶点有空的邻接列表
void addEdge(int src, int dest) {
adj[src].push_back(dest);
}
// 递归实现DFS
void DFS(int node, bool visited[]) {
if (visited[node] == false) { // 检查节点是否已访问
cout << "Visiting node: " << node << endl;
visited[node] = true;
for (int i : adj[node]) { // 遍历当前节点的所有邻居
DFS(i, visited); // 对每个邻居进行深度优先搜索
}
}
}
};
int main() {
Graph g(4); // 创建一个包含4个顶点的图
g.addEdge(0, 1); // 边连接0到1
g.addEdge(0, 2); // 边连接0到2
g.addEdge(1, 2); // 边连接1到2
g.addEdge(2, 0); // 边连接2回0形成环路
g.addEdge(2, 3); // 边连接2到3
bool* visited = new bool[4]; // 记录每个顶点是否已访问
for (int i = 0; i < 4; ++i)
visited[i] = false;
cout << "Depth First Traversal (starting from vertex 2): ";
g.DFS(2, visited);
return 0;
}
```
在这个例子中,我们首先创建了一个邻接列表表示的图,然后通过`addEdge`方法添加边。`DFS`函数接受一个节点和一个标志数组`visited`,如果节点未访问,则打印节点并标记为已访问,接着递归地对所有相邻节点进行DFS。由于存在环路(边连接2回0),需要注意处理这种情况以避免无限循环。
阅读全文