C++ 深度优先搜索 (DFS) 代码示例 - 详解与应用
以下是使用 C++ 编写的深度优先搜索 (DFS) 示例代码,该代码可以用来计算图中连通分量的数量。
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
void dfs(int node, vector<bool>& visited, vector<vector<int>>& graph) {
visited[node] = true;
for (int neighbor : graph[node]) {
if (!visited[neighbor]) {
dfs(neighbor, visited, graph);
}
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> graph(n + 1);
for (int i = 0; i < m; i++) {
int k;
cin >> k;
vector<int> accounts(k);
for (int j = 0; j < k; j++) {
cin >> accounts[j];
}
for (int j = 0; j < k; j++) {
for (int l = j + 1; l < k; l++) {
graph[accounts[j]].push_back(accounts[l]);
graph[accounts[l]].push_back(accounts[j]);
}
}
}
vector<bool> visited(n + 1, false);
int count = 0;
for (int i = 1; i <= n; i++) {
if (!visited[i]) {
dfs(i, visited, graph);
count++;
}
}
cout << count << endl;
return 0;
}
代码解析:
-
dfs(node, visited, graph)函数:- 递归地遍历图,从
node节点开始,标记访问过的节点并继续访问其未访问的邻居。
- 递归地遍历图,从
-
main()函数:- 首先,从标准输入读取图的节点数
n和边数m。 - 创建一个邻接列表
graph来表示图,其中graph[i]保存与节点i相连的节点列表。 - 使用一个
visited数组来跟踪每个节点是否已被访问过。 - 使用一个计数器
count来统计连通分量的数量。 - 遍历所有节点,如果一个节点未被访问,则从该节点开始进行 DFS 遍历,并增加
count的值。 - 最后,输出
count的值,表示图中连通分量的数量。
- 首先,从标准输入读取图的节点数
应用场景:
深度优先搜索 (DFS) 是一种常用的图遍历算法,在各种应用场景中都有广泛的应用,例如:
- 查找图中的连通分量
- 寻找图中两点之间的路径
- 拓扑排序
- 解决迷宫问题
- 检测图中的环路
总结:
本文提供了一个 C++ 实现深度优先搜索 (DFS) 的代码示例,并详细解释了代码逻辑和应用场景。通过分析示例代码,读者可以学习如何使用 DFS 算法解决各种问题。
希望这可以帮助到你!
原文地址: http://www.cveoy.top/t/topic/tKa 著作权归作者所有。请勿转载和采集!