C++ BFS DFS
时间: 2024-08-14 19:06:42 浏览: 82
C++ 中的 Breadth-First Search (BFS) 和 Depth-First Search (DFS) 是两种常用的图遍历算法,它们常用于寻找图中两点之间的最短路径和探索图的结构。
**Breadth-First Search (BFS)**:
BFS 从起点开始,逐层地遍历图的节点。它会先访问所有离起点最近的节点,然后再去访问下一层的节点。在广度优先搜索中,通常使用队列作为数据结构,因为其先进先出的特点适合处理这种层次化的遍历。BFS 适用于找到两个点间的最短路径,比如在有向图中查找最短路径。
**Depth-First Search (DFS)**:
DFS 从起点开始,尽可能深地沿着一条路径走到底,然后回溯到上一个未访问过的节点。这通常使用递归或栈来实现。DFS 可能会发现更深层次的分支,适合于查找连通组件、拓扑排序等场景。在无向图中,如果找到了目标节点,DFS 也能保证是最小深度的路径。
相关问题
c++bfs dfs
在C++中,BFS(宽度优先搜索)和DFS(深度优先搜索)是图论中的两种常用算法,用于遍历或查找图中的节点。
1. **BFS** (广度优先搜索):这是一种层次遍历的方式,从起点开始,先访问所有距离起点最近的节点,然后逐层向下探索。C++中通常使用队列数据结构来实现BFS,因为队列的特点是先进先出,适合处理邻接矩阵表示的图。
示例代码(用vector作为队列):
```cpp
using namespace std;
void bfs(vector<vector<int>>& graph, int start) {
queue<int> q({start});
vector<bool> visited(graph.size(), false);
while (!q.empty()) {
int curr = q.front(); q.pop();
cout << curr << " ";
visited[curr] = true;
for (int neighbor : graph[curr]) {
if (!visited[neighbor])
q.push(neighbor);
}
}
}
```
2. **DFS** (深度优先搜索):它是一种递归的方式,尽可能深地进入图的某个分支,直到达到某一点不能再前进为止,然后返回并探索其他路径。C++中通常使用递归或栈来实现DFS,因为栈的特点是后进先出,适合处理链式结构或邻接列表表示的图。
示例代码(用stack作为栈):
```cpp
void dfs(vector<vector<int>>& graph, int start, vector<bool>& visited = {}) {
stack<int> s({start});
visited.resize(graph.size(), false);
while (!s.empty()) {
int curr = s.top(); s.pop();
cout << curr << " ";
visited[curr] = true;
for (int neighbor : graph[curr])
if (!visited[neighbor])
s.push(neighbor);
}
}
```
c++ bfs和dfs算法模板
BFS(广度优先搜索)算法模板:
```c++
#include <iostream>
#include <queue>
using namespace std;
const int N = 1e5 + 10;
int n; // 图的大小
int g[N][N]; // 存储图的邻接矩阵
bool st[N]; // 标记数组
void bfs(int u) {
queue<int> q;
q.push(u);
st[u] = true;
while (!q.empty()) {
int t = q.front();
q.pop();
// 处理节点 t
for (int i = 1; i <= n; i++) {
if (g[t][i] && !st[i]) {
q.push(i);
st[i] = true;
}
}
}
}
int main() {
// 读入图
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> g[i][j];
}
}
// BFS 遍历整张图
for (int i = 1; i <= n; i++) {
if (!st[i]) bfs(i);
}
return 0;
}
```
DFS(深度优先搜索)算法模板:
```c++
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n; // 图的大小
int g[N][N]; // 存储图的邻接矩阵
bool st[N]; // 标记数组
void dfs(int u) {
st[u] = true;
// 处理节点 u
for (int i = 1; i <= n; i++) {
if (g[u][i] && !st[i]) {
dfs(i);
}
}
}
int main() {
// 读入图
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> g[i][j];
}
}
// DFS 遍历整张图
for (int i = 1; i <= n; i++) {
if (!st[i]) dfs(i);
}
return 0;
}
```
注意:以上模板都是针对无向图的,如果是有向图需要修改邻接矩阵的定义和遍历方式。
阅读全文