深度优先搜索和广度优先搜索c++代码
时间: 2023-06-23 10:47:31 浏览: 112
C++无向图深度优先和广度优先遍历(编译可运行).rar
5星 · 资源好评率100%
深度优先搜索和广度优先搜索是常见的图遍历算法,以下是它们的C++代码实现:
深度优先搜索:
```
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
vector<int> g[N]; // 存储图
bool vis[N]; // 标记是否已经访问
void dfs(int u) {
vis[u] = true; // 标记已经访问
printf("%d ", u); // 输出当前节点
for (int i = 0; i < g[u].size(); i++) { // 遍历所有邻接节点
int v = g[u][i];
if (!vis[v]) { // 如果未访问过,递归访问
dfs(v);
}
}
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v); // 添加边
g[v].push_back(u);
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) { // 如果未访问过,从该节点开始进行dfs
dfs(i);
}
}
return 0;
}
```
广度优先搜索:
```
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
vector<int> g[N]; // 存储图
bool vis[N]; // 标记是否已经访问
void bfs(int u) {
queue<int> q;
q.push(u); // 将起点入队
vis[u] = true; // 标记已经访问
while (!q.empty()) { // 当队列不为空时进行循环
int t = q.front();
q.pop();
printf("%d ", t); // 输出当前节点
for (int i = 0; i < g[t].size(); i++) { // 遍历所有邻接节点
int v = g[t][i];
if (!vis[v]) { // 如果未访问过,标记已经访问并入队
vis[v] = true;
q.push(v);
}
}
}
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v); // 添加边
g[v].push_back(u);
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) { // 如果未访问过,从该节点开始进行bfs
bfs(i);
}
}
return 0;
}
```
阅读全文