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

全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
11-15 18:39
已编辑
西安交通大学 Java
全村最靓的仔仔:卧槽,佬啥bg呢,本也是西交么
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务