构造一个无向图,从给定起点开始进行深度优先遍历和广度优先遍历,并输出相应的遍历序列。 输入格式: 输入第一行给出三个正整数,分别表示无向图的节点数N(1<N≤10)、边数M(≤50)和遍历的起始节点编号S(节点从1到N编号)。 随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号。用C语言展示代码
时间: 2024-02-20 11:58:07 浏览: 109
好的,我可以用 C 语言来展示代码,如下所示:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_N 100 // 图中节点的最大数量
#define MAX_M 50 // 图中边的最大数量
int adj[MAX_N][MAX_N]; // 邻接矩阵,adj[i][j] 表示节点 i 和节点 j 是否相连
bool visited[MAX_N]; // 标记数组,visited[i] 表示节点 i 是否已被访问
void dfs(int u, int n) // 深度优先遍历,从节点 u 开始,n 表示节点的数量
{
visited[u] = true; // 标记节点 u 为已访问
printf("%d ", u); // 输出节点 u
for (int v = 1; v <= n; v++) // 遍历节点 u 的所有邻居节点
{
if (adj[u][v] && !visited[v]) // 如果节点 u 和节点 v 相连,并且节点 v 未被访问
{
dfs(v, n); // 递归访问邻居节点 v
}
}
}
void bfs(int u, int n) // 广度优先遍历,从节点 u 开始,n 表示节点的数量
{
int q[MAX_N]; // 用数组来实现队列
int front = 0, rear = 0; // 队列的头和尾
q[rear++] = u; // 将节点 u 入队
visited[u] = true; // 标记节点 u 为已访问
while (front < rear) // 只要队列不为空就一直循环
{
int v = q[front++]; // 取出队首节点 v
printf("%d ", v); // 输出节点 v
for (int w = 1; w <= n; w++) // 遍历节点 v 的所有邻居节点
{
if (adj[v][w] && !visited[w]) // 如果节点 v 和节点 w 相连,并且节点 w 未被访问
{
q[rear++] = w; // 将节点 w 入队
visited[w] = true; // 标记节点 w 为已访问
}
}
}
}
int main()
{
int n, m, s;
scanf("%d %d %d", &n, &m, &s);
for (int i = 0; i < m; i++)
{
int u, v;
scanf("%d %d", &u, &v);
adj[u][v] = adj[v][u] = 1; // 存储边 (u, v) 和边 (v, u)
}
dfs(s, n); // 从节点 s 开始深度优先遍历
printf("\n"); // 换行
for (int i = 1; i <= n; i++) // 初始化标记数组 visited
{
visited[i] = false;
}
bfs(s, n); // 从节点 s 开始广度优先遍历
return 0;
}
```
希望这个 C 语言代码能够帮助你解决问题。如果还有其他问题,请继续提问。
阅读全文