用C++函数实现图的深度和广度优先遍历。
时间: 2024-10-25 07:17:01 浏览: 18
C++无向图深度优先和广度优先遍历(编译可运行).rar
5星 · 资源好评率100%
在C++中,我们可以使用STL中的`vector`来模拟图的数据结构,同时利用递归或迭代的方式实现深度优先搜索(Depth First Search, DFS)和广度优先搜索(Breadth First Search, BFS)。这里是一个简单的示例:
**深度优先搜索(DFS)**:
```cpp
#include <iostream>
#include <vector>
// 用于表示图的邻接表
std::vector<std::vector<int>> adjList;
void dfs(int node) {
std::cout << node << " ";
// 检查当前节点是否有未访问的邻居
for (int neighbor : adjList[node]) {
if (!visited[neighbor]) {
visited[neighbor] = true; // 标记邻居已访问
dfs(neighbor); // 递归访问邻居
}
}
}
// 主函数演示如何调用DFS
void dfsGraph() {
int n;
std::cout << "Enter number of vertices: ";
std::cin >> n;
// 初始化visited数组
std::vector<bool> visited(n, false);
// 添加图的边或构建邻接表
// 这里假设输入是节点之间的关系,例如1-2, 1-3等
for (int i = 0; i < n - 1; i++) {
int u, v;
std::cin >> u >> v;
adjList[u].push_back(v);
adjList[v].push_back(u); // 由于图是无向的,添加双向边
}
// 开始从任一节点开始DFS
dfs(0);
}
```
**广度优先搜索(BFS)**:
```cpp
#include <queue>
void bfs(int start) {
std::queue<int> q;
std::vector<bool> visited(n, false);
q.push(start);
visited[start] = true;
while (!q.empty()) {
int node = q.front();
q.pop();
std::cout << node << " ";
// 依次访问邻居,标记为已访问
for (int neighbor : adjList[node]) {
if (!visited[neighbor]) {
visited[neighbor] = true;
q.push(neighbor);
}
}
}
}
// 主函数演示如何调用BFS
void bfsGraph() {
// ... 其他部分同上
bfs(0);
}
```
在这个例子中,我们首先创建了一个邻接列表`adjList`来存储图的关系。然后,通过用户输入添加边,或者在实际应用中预先设置好。`dfs`和`bfs`函数分别用于执行深度优先和广度优先遍历,它们都接收起始节点作为参数。
阅读全文