无向图的深度优先遍历非递归
作者:野牛程序员:2023-12-03 21:42:49 C++阅读 2746
无向图的深度优先遍历非递归
使用非递归方式进行无向图的深度优先遍历可以通过使用栈来实现。以下是一个简单的算法步骤:
创建一个空栈,并将起始节点压入栈中。
创建一个集合(通常是哈希集合),用于记录已经访问过的节点,防止重复访问。
进入循环,直到栈为空: a. 出栈一个节点,并标记为已访问。 b. 遍历该节点的所有未访问过的邻居节点,将其压入栈中。 c. 将当前节点标记为已访问,以防止重复访问。
以下是用C++编程实现无向图的非递归深度优先遍历的简单示例。在这个示例中,假设图的节点是整数,图的邻接表存储在unordered_map
中:
#include <iostream> #include <unordered_map> #include <stack> #include <unordered_set> using namespace std; void dfs_iterative(const unordered_map<int, vector<int>>& graph, int start_node) { stack<int> s; unordered_set<int> visited; s.push(start_node); while (!s.empty()) { int current_node = s.top(); s.pop(); if (visited.find(current_node) == visited.end()) { cout << current_node << " "; // 访问节点 visited.insert(current_node); for (int neighbor : graph.at(current_node)) { if (visited.find(neighbor) == visited.end()) { s.push(neighbor); } } } } } int main() { // 构建一个简单的无向图的邻接表表示 unordered_map<int, vector<int>> graph; graph[1] = {2, 3}; graph[2] = {1, 4, 5}; graph[3] = {1, 6}; graph[4] = {2}; graph[5] = {2, 6}; graph[6] = {3, 5}; int start_node = 1; // 选择起始节点 cout << "Depth First Traversal (Non-Recursive): "; dfs_iterative(graph, start_node); return 0; }
下面是一个不使用 <unordered_map>
, <unordered_set>
头文件的 C++ 示例,
#include <iostream> #include <vector> #include <stack> #include <set> using namespace std; void dfs_iterative(const vector<vector<int>>& graph, int start_node) { stack<int> s; set<int> visited; s.push(start_node); while (!s.empty()) { int current_node = s.top(); s.pop(); if (visited.find(current_node) == visited.end()) { cout << current_node << " "; // 访问节点 visited.insert(current_node); for (int neighbor : graph[current_node]) { if (visited.find(neighbor) == visited.end()) { s.push(neighbor); } } } } } int main() { // 构建一个简单的无向图的邻接表表示 vector<vector<int>> graph = { {2, 3}, {1, 4, 5}, {1, 6}, {2}, {2, 6}, {3, 5} }; int start_node = 1; // 选择起始节点 cout << "Depth First Traversal (Non-Recursive): "; dfs_iterative(graph, start_node); return 0; }
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

- 上一篇:python自动截图网页
- 下一篇:PS2在Arduino中如何引脚设置