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
函数进行深度优先搜索。这个过程一直持续到当前节点的所有邻接点都被访问过为止。 - 在主函数中,首先读入节点的数量和边的数量,然后读入每条边的两个端点,将它们添加到邻接表中。注意对于无向图,还需要将第二个端点添加到第一个端点的邻接表中。然后初始化标记数组,将所有节点标记为未访问。最后从用户输入的起始节点开始进行深度优先搜索。