c语言使用广度优先遍历求不带权无向连通图的最短路径
时间: 2023-11-06 19:12:23 浏览: 96
广度优先遍历可以用来求不带权无向连通图的最短路径。具体步骤如下:
1. 初始化队列,将起点入队。
2. 初始化距离数组,将起点到起点的距离设为0,其他点的距离设为无穷大。
3. 开始循环,直到队列为空:
a. 取出队首元素。
b. 遍历队首元素的所有邻居节点,如果该邻居节点的距离为无穷大,则更新该邻居节点的距离为当前节点的距离加1,并将该邻居节点入队。
4. 循环结束后,距离数组中存储的就是起点到各个节点的最短路径长度。
下面是使用C语言实现的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
int graph[MAX_SIZE][MAX_SIZE]; // 图的邻接矩阵
int visited[MAX_SIZE]; // 访问标记数组
int distance[MAX_SIZE]; // 距离数组
int queue[MAX_SIZE]; // 队列
int front = 0; // 队首指针
int rear = 0; // 队尾指针
int bfs(int start, int end, int n) {
// 初始化队列和距离数组
front = 0;
rear = 0;
for (int i = 0; i < n; i++) {
visited[i] = 0;
distance[i] = -1;
}
// 将起点入队,并标记为已访问
queue[rear++] = start;
visited[start] = 1;
distance[start] = 0;
// 开始循环,直到队列为空
while (front != rear) {
int node = queue[front++]; // 取出队首元素
for (int i = 0; i < n; i++) {
if (graph[node][i] == 1 && visited[i] == 0) { // 遍历邻居节点
visited[i] = 1; // 标记为已访问
distance[i] = distance[node] + 1; // 更新距离
queue[rear++] = i; // 入队
if (i == end) {
return distance[end]; // 找到终点,返回最短路径长度
}
}
}
}
return -1; // 没有找到终点,返回-1表示无法到达
}
int main() {
int n, m; // n为节点数,m为边数
scanf("%d%d", &n, &m);
// 初始化邻接矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
graph[i][j] = 0;
}
}
// 读入边的信息,建立邻接矩阵
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
graph[u][v] = 1;
graph[v][u] = 1;
}
int start, end;
scanf("%d%d", &start, &end); // 读入起点和终点
int shortest_path = bfs(start, end, n); // 求最短路径长度
printf("%d\n", shortest_path); // 输出最短路径长度
return 0;
}
```
阅读全文