构造一个无向图,从给定起点开始进行深度优先遍历和广度优先遍历,并输出相应的遍历序列。 输入格式: 输入第一行给出三个正整数,分别表示无向图的节点数N(1<N≤10)、边数M(≤50)和遍历的起始节点编号S(节点从1到N编号)。 随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号。
时间: 2024-02-20 21:58:04 浏览: 236
好的,我知道了你的问题。这是一个关于图的遍历的问题,我会根据你的要求进行回答。
首先,我们需要构造这个无向图。可以用邻接矩阵或邻接表表示。这里我用邻接表表示。
具体的做法是,用一个 vector 数组 adj 来表示每个节点的邻居节点。例如,adj[i] 中存储了节点 i 的所有邻居节点。
接下来,我们可以用深度优先遍历和广度优先遍历来遍历这个无向图,并输出相应的遍历序列。
深度优先遍历(DFS)的思路是尽可能深地搜索每个节点,直到没有未被访问的相邻节点为止。具体实现可以用递归或栈来实现。以下是用递归实现深度优先遍历的代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
vector<int> adj[100]; // 邻接表,adj[i] 存储节点 i 的所有邻居节点
bool visited[100]; // 标记数组,visited[i] 表示节点 i 是否已被访问
void dfs(int u) // 深度优先遍历,从节点 u 开始
{
visited[u] = true; // 标记节点 u 为已访问
cout << u << ' '; // 输出节点 u
for (int v : adj[u]) // 遍历节点 u 的所有邻居节点
{
if (!visited[v]) // 如果邻居节点 v 未被访问
{
dfs(v); // 递归访问邻居节点 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); // 存储边 (u, v)
adj[v].push_back(u); // 存储边 (v, u)
}
dfs(s); // 从节点 s 开始深度优先遍历
return 0;
}
```
广度优先遍历(BFS)的思路是先访问当前节点的所有相邻节点,然后再访问相邻节点的相邻节点,以此类推。具体实现可以用队列来实现。以下是用队列实现广度优先遍历的代码:
```cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector<int> adj[100]; // 邻接表,adj[i] 存储节点 i 的所有邻居节点
bool visited[100]; // 标记数组,visited[i] 表示节点 i 是否已被访问
void bfs(int u) // 广度优先遍历,从节点 u 开始
{
queue<int> q; // 用队列来存储待访问的节点
q.push(u); // 将节点 u 入队
visited[u] = true; // 标记节点 u 为已访问
while (!q.empty()) // 只要队列不为空就一直循环
{
int v = q.front(); // 取出队首节点 v
q.pop(); // 将节点 v 出队
cout << v << ' '; // 输出节点 v
for (int w : adj[v]) // 遍历节点 v 的所有邻居节点
{
if (!visited[w]) // 如果邻居节点 w 未被访问
{
q.push(w); // 将节点 w 入队
visited[w] = true; // 标记节点 w 为已访问
}
}
}
}
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); // 存储边 (u, v)
adj[v].push_back(u); // 存储边 (v, u)
}
bfs(s); // 从节点 s 开始广度优先遍历
return 0;
}
```
希望这个回答能够解决你的问题。如果还有其他问题,可以继续提问。
阅读全文