用C++代码写出图的深度优先遍历和广度优先遍历
时间: 2023-10-04 22:07:41 浏览: 97
Graph1_非递归算法进行深度优先遍历和广度优先遍历_
5星 · 资源好评率100%
下面是用C++代码实现图的深度优先遍历和广度优先遍历的示例:
```c++
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
//定义图的邻接矩阵表示
const int maxn = 1000;
int G[maxn][maxn];
int n, m; //n为节点数,m为边数
//深度优先遍历
void dfs(int u, bool vis[]) {
vis[u] = true; //标记节点u已经被访问
cout << u << " "; //输出节点u
for (int i = 1; i <= n; i++) {
if (G[u][i] && !vis[i]) { //如果u和i之间有边,并且i还没被访问
dfs(i, vis); //从i节点开始继续深度优先遍历
}
}
}
//广度优先遍历
void bfs(int u, bool vis[]) {
queue<int> q;
q.push(u); //将起始节点u入队
vis[u] = true; //标记节点u已经被访问
while (!q.empty()) { //队列不为空时循环
int t = q.front(); //取出队首
q.pop(); //弹出队首
cout << t << " "; //输出节点t
for (int i = 1; i <= n; i++) {
if (G[t][i] && !vis[i]) { //如果t和i之间有边,并且i还没被访问
q.push(i); //将i入队
vis[i] = true; //标记节点i已经被访问
}
}
}
}
int main() {
cin >> n >> m; //输入节点数和边数
int u, v;
for (int i = 1; i <= m; i++) {
cin >> u >> v; //输入一条边的起点和终点
G[u][v] = G[v][u] = 1; //表示无向图,所以这条边的两个方向都要存储
}
bool vis[maxn] = { 0 }; //初始化所有节点为未访问状态
cout << "深度优先遍历:" << endl;
for (int i = 1; i <= n; i++) { //从每个未访问过的节点开始深度优先遍历
if (!vis[i]) {
dfs(i, vis);
}
}
cout << endl;
memset(vis, 0, sizeof(vis)); //重置所有节点为未访问状态
cout << "广度优先遍历:" << endl;
for (int i = 1; i <= n; i++) { //从每个未访问过的节点开始广度优先遍历
if (!vis[i]) {
bfs(i, vis);
}
}
cout << endl;
return 0;
}
```
注:以上代码只适用于无向图的情况。如果是有向图,则只需将邻接矩阵的对称性去掉即可。
阅读全文