用C++构造一个无向图,从给定起点开始进行深度优先遍历和广度优先遍历,并输出相应的遍历序列。 输入格式: 输入第一行给出三个正整数,分别表示无向图的节点数N(1<N≤10)、边数M(≤50)和遍历的起始节点编号S(节点从1到N编号)。 随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号。
时间: 2024-02-15 11:03:53 浏览: 81
课程设计 图的遍历演示报告 有需求分析源码和结果
5星 · 资源好评率100%
下面是代码实现:
```c++
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 10;
vector<int> adj[MAXN+1]; // 存储邻接表,adj[i]表示与节点i相邻的节点
bool visited[MAXN+1]; // 存储节点是否被访问过
void dfs(int u) {
visited[u] = true;
cout << u << " ";
for (int v : adj[u]) {
if (!visited[v]) {
dfs(v);
}
}
}
void bfs(int s) {
queue<int> q;
q.push(s);
visited[s] = true;
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << " ";
for (int v : adj[u]) {
if (!visited[v]) {
visited[v] = true;
q.push(v);
}
}
}
}
int main() {
int n, m, s;
cin >> n >> m >> s;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
// 深度优先遍历
cout << "DFS: ";
dfs(s);
cout << endl;
// 广度优先遍历
fill(visited, visited+n+1, false);
cout << "BFS: ";
bfs(s);
cout << endl;
return 0;
}
```
输入样例:
```
5 5 1
1 2
1 3
2 3
2 4
3 5
```
输出样例:
```
DFS: 1 2 3 5 4
BFS: 1 2 3 4 5
```
阅读全文