C++中的深度优先搜索算法

C++中的深度优先搜索算法

深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

以下是使用C++实现深度优先搜索的示例代码及其解析:

#include  
#include  
  
using namespace std;  
  
vector 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;  
}

代码解析:

  1. 首先定义了一个邻接表adj和一个标记数组visited,用于存储图的信息和记录每个节点是否被访问过。邻接表使用vector数组实现,可以方便的添加和删除邻接点。标记数组使用布尔型数组实现,方便标记和判断节点是否被访问过。
  2. 然后定义了一个深度优先搜索函数dfs,接受一个节点的编号作为参数。首先将当前节点标记为已访问,然后输出当前节点的编号,接着遍历当前节点的所有邻接点。如果邻接点未被访问过,则递归调用dfs函数进行深度优先搜索。这个过程一直持续到当前节点的所有邻接点都被访问过为止。
  3. 在主函数中,首先读入节点的数量和边的数量,然后读入每条边的两个端点,将它们添加到邻接表中。注意对于无向图,还需要将第二个端点添加到第一个端点的邻接表中。然后初始化标记数组,将所有节点标记为未访问。最后从用户输入的起始节点开始进行深度优先搜索。

你可能感兴趣的:(深度优先,算法)