c语言使用广度优先遍历求不带权无向连通图的最短路径,并输出其广度优先遍历和最短路径
时间: 2023-08-06 08:14:53 浏览: 100
以下是使用广度优先遍历求不带权无向连通图最短路径的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 100 // 最大节点数
int adjacency_matrix[MAX_NUM][MAX_NUM]; // 邻接矩阵
int visited[MAX_NUM]; // 访问标记数组
int queue[MAX_NUM]; // 队列
int path[MAX_NUM]; // 最短路径数组
int front = -1, rear = -1;
// 初始化邻接矩阵
void init_matrix(int n)
{
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
adjacency_matrix[i][j] = 0;
}
}
}
// 添加边
void add_edge(int u, int v)
{
adjacency_matrix[u][v] = 1;
adjacency_matrix[v][u] = 1;
}
// 广度优先遍历
void bfs(int start, int n)
{
int i, node;
visited[start] = 1;
queue[++rear] = start;
while (front != rear) {
node = queue[++front];
printf("%d ", node);
for (i = 0; i < n; i++) {
if (adjacency_matrix[node][i] == 1 && visited[i] == 0) {
visited[i] = 1;
queue[++rear] = i;
path[i] = node;
}
}
}
}
// 输出最短路径
void print_path(int start, int end)
{
if (start == end) {
printf("%d ", start);
return;
}
print_path(start, path[end]);
printf("%d ", end);
}
int main()
{
int n, m, i, u, v, start, end;
printf("请输入节点数和边数:");
scanf("%d %d", &n, &m);
init_matrix(n);
printf("请输入每条边的两个端点:\n");
for (i = 0; i < m; i++) {
scanf("%d %d", &u, &v);
add_edge(u, v);
}
printf("请输入起点和终点:");
scanf("%d %d", &start, &end);
bfs(start, n);
printf("\n最短路径为:");
print_path(start, end);
printf("\n");
return 0;
}
```
这个程序中,我们首先初始化了邻接矩阵,并且通过 `add_edge()` 函数添加边。然后我们输入起点和终点,并调用 `bfs()` 函数进行广度优先遍历,得到最短路径。最后,我们通过 `print_path()` 函数输出最短路径。
需要注意的是,这个程序中没有考虑图中存在环的情况,如果存在环,我们需要增加一个判断环的条件,否则会进入死循环。
阅读全文