题解 | #【模板】单源最短路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;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 11:43
春招失败、父母离婚,好像我的人生一团糟,一年来压力大到常常崩溃。不知道能跟谁聊,朋友其实对我非常好,但是她无意中表达出来的家庭幸福都会刺痛到我……和ai聊天,我的未来在更高处,不在楼下,忍不住爆哭😭
youngfa:害,妹妹,我是一个研究生(很上进很想找到好工作的那种),但去年因为生病回家休养错过了秋招(当时对我的冲击也是非常大的),这学期返校来了也是把论文盲审交了后才开始找工作,现在也是一个offer没有,但我就没有像你一样把这个阶段性的事情绑定到人生上,人生不仅很长,也很广阔,先停下来,放松一下哦。不要被外部环境灌输的思维操控了,好好爱自己!
点赞 评论 收藏
分享
03-21 08:46
已编辑
门头沟学院 C++
一个什么都不会的学生:当你有硕士学历的时候HR会说就是比本科生强
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务