C++中的深度优先搜索算法
深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
以下是使用C++实现深度优先搜索的示例代码及其解析:
#include<iostream>
#include<vector>
using namespace std;
vector<int> adj[100005]; // 邻接表存储图
bool visited[100005]; // 标记数组,记录每个节点是否被访问过
void dfs(int node) { // 深度优先搜索函数
visited[node] = true; // 标记当前节点为已访问
cout << node << " "; // 输出当前节点编号
int i;
for(i = 0; i < adj[node].size(); i++) { // 遍历当前节点的所有邻接点
if(!visited[adj[node][i]]) { // 如果邻接点未被访问过,则继续访问
dfs(adj[node][i]); // 递归调用dfs函数
}
}
}
int main() {
int n, m; // n为节点数,m为边数
cin >> n >> m;
for(int i = 0; i < m; i++) { // 读入m条边,构建邻接表
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u); // 对于无向图,还需要将v添加到u的邻接表中
}
int start; // 开始遍历的节点编号
cin >> start; // 读入开始遍历的节点编号
for(int i = 1; i <= n; i++) { // 初始化visited数组,将所有节点标记为未访问
visited[i] = false;
}
dfs(start); // 从start节点开始进行深度优先搜索
return 0;
}
代码解析:
adj
和一个标记数组visited
,用于存储图的信息和记录每个节点是否被访问过。邻接表使用vector数组实现,可以方便的添加和删除邻接点。标记数组使用布尔型数组实现,方便标记和判断节点是否被访问过。dfs
,接受一个节点的编号作为参数。首先将当前节点标记为已访问,然后输出当前节点的编号,接着遍历当前节点的所有邻接点。如果邻接点未被访问过,则递归调用dfs
函数进行深度优先搜索。这个过程一直持续到当前节点的所有邻接点都被访问过为止。