请写一段深度搜索的C++代码
时间: 2024-02-17 09:05:29 浏览: 71
以下是一个简单的深度优先搜索的C++代码示例,用于从给定的起点遍历无向图:
```c++
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
vector<int> adj[100001]; // 存储无向图的邻接表
bool visited[100001]; // 存储每个节点是否被访问
stack<int> st; // 存储深度优先搜索时的节点栈
// 深度优先搜索函数
void dfs(int start) {
visited[start] = true; // 标记起点已被访问
st.push(start); // 将起点入栈
while (!st.empty()) { // 当栈不为空时,继续搜索
int cur = st.top(); // 取出栈顶的节点
st.pop(); // 弹出栈顶节点
cout << cur << " "; // 输出当前节点
for (int i = 0; i < adj[cur].size(); i++) { // 遍历当前节点的邻居节点
int next = adj[cur][i];
if (!visited[next]) { // 如果邻居节点未被访问
visited[next] = true; // 标记邻居节点已被访问
st.push(next); // 将邻居节点入栈
}
}
}
}
int main() {
int n, m, start;
cin >> n >> m >> start; // 输入节点数,边数和起点
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v; // 输入每条边的起点和终点
adj[u].push_back(v); // 存储无向图的邻接表
adj[v].push_back(u);
}
dfs(start); // 从起点开始深度优先搜索
return 0;
}
```
该程序通过邻接表存储无向图,使用一个布尔数组 `visited` 记录每个节点是否被访问过,使用栈 `st` 存储深度优先搜索时的节点顺序。在 `dfs` 函数中,首先标记起点已被访问,并将其入栈。然后,当栈不为空时,取出栈顶的节点,输出该节点,并遍历其邻居节点,将未被访问过的邻居节点入栈。最终,整个无向图都会被遍历一遍。
阅读全文