题解 | #【模板】单源最短路1#
【模板】单源最短路1
https://www.nowcoder.com/practice/f24504c9ff544f7c808f76693cc34af8
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NODES 5009
// 定义邻接表节点
typedef struct Node {
int vertex;
struct Node* next;
} Node;
// 定义邻接表、访问数组和距离数组
Node* adj[MAX_NODES];
int visited[MAX_NODES], dist[MAX_NODES], queue[MAX_NODES];
// 广度优先搜索(BFS)函数
int bfs(int n) {
int front = 0, rear = 0;
// 初始化队列,并从1号点开始
queue[rear++] = 1;
visited[1] = 1; // 标记1号点为已访问
dist[1] = 0; // 1号点的距离为0
// 执行BFS
while (front < rear) {
int u = queue[front++]; // 取出队列的首元素
// 遍历u的所有邻接点
Node* curr = adj[u];
while (curr != NULL) {
int v = curr->vertex;
// 如果v没有被访问过
if (!visited[v]) {
// 标记v为已访问
visited[v] = 1;
// 更新v的距离
dist[v] = dist[u] + 1;
// 将v加入队列
queue[rear++] = v;
// 如果v是n号点,返回最短距离
if (v == n) {
return dist[v];
}
}
curr = curr->next;
}
}
// 如果没有找到从1号点到n号点的路径,返回-1
return -1;
}
int main() {
int n, m, u, v;
// 读取节点数和边数
scanf("%d %d", &n, &m);
// 初始化邻接表
for (int i = 1; i <= n; i++) {
adj[i] = NULL;
}
// 读取m条边,并更新邻接表
while (m--) {
scanf("%d %d", &u, &v);
// 创建新节点并添加到u的邻接表中
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->vertex = v;
newNode->next = adj[u];
adj[u] = newNode;
// 创建新节点并添加到v的邻接表中(无向图)
newNode = (Node*)malloc(sizeof(Node));
newNode->vertex = u;
newNode->next = adj[v];
adj[v] = newNode;
}
// 调用BFS函数查找从1号点到n号点的最短距离
printf("%d\n", bfs(n));
return 0;
}

