Acwing847 图中点的层次(bfs)

这道题用的是bfs,一开始用了dfs搜出了答案为4

题目

给定一个 n个点 m 条边的有向图,图中可能存在重边和自环。

所有边的长度都是 1,点的编号为 1∼n。

请你求出 1 号点到 n 号点的最短距离,如果从 1 号点无法走到 n 号点,输出 −1。

输入格式

第一行包含两个整数 n 和 m。

接下来 m 行,每行包含两个整数 a 和 b,表示存在一条从 a 走到 b 的长度为 1 的边。

输出格式

输出一个整数,表示 1 号点到 n号点的最短距离。

数据范围

1≤n,m≤10

输入样例:

复制代码
4 5
1 2
2 3
3 4
1 3
1 4

输出样例:

复制代码
1

解析与代码

bfs的模版思路

  1. 使用队列保存待访问的节点。

  2. 初始化距离数组(d 数组)为 -1,表示节点未被访问。

  3. 将起始节点放入队列,并设置距离为 0。

  4. 队列非空时,循环执行以下步骤:

    • 弹出队首节点。
    • 遍历该节点的相邻节点。
    • 如果相邻节点未被访问,更新距离,并将相邻节点入队。
  5. 返回目标节点的距离。

java 复制代码
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    static int n, m, idx, N = 100010, ans = Integer.MAX_VALUE;
    static int[] e = new int[N * 2], h = new int[N * 2], ne = new int[N * 2], d = new int[N * 2];
    static boolean[] state = new boolean[N];

    // 添加边,建立邻接表
    public static void add(int a, int b) {
        e[idx] = b;
        ne[idx] = h[a];
        h[a] = idx ++;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();
        Arrays.fill(h, -1);

        // 构建图的邻接表
        for (int i = 0; i < m; i++) {
            int a = in.nextInt();
            int b = in.nextInt();
            add(a, b);
        }

        System.out.println(bfs());
    }

    public static int bfs() {
        Arrays.fill(d, -1);
        Queue<Integer> q = new LinkedList<>();
        d[1] = 0;
        q.offer(1);

        while (!q.isEmpty()) {
            int t = q.poll();

            // 遍历与当前节点 t 相邻的节点
            for (int i = h[t]; i != -1; i = ne[i]) {
                int j = e[i];
                if (d[j] != -1) continue; // 如果节点已经访问过,跳过

                d[j] = d[t] + 1; // 更新节点 j 的距离
                q.offer(j); // 将节点 j 入队
            }
        }
        return d[n]; // 返回目标节点 n 的距离
    }
}
相关推荐
小信啊啊15 分钟前
Go语言切片slice
开发语言·后端·golang
Victor3562 小时前
Netty(20)如何实现基于Netty的WebSocket服务器?
后端
缘不易2 小时前
Springboot 整合JustAuth实现gitee授权登录
spring boot·后端·gitee
Kiri霧2 小时前
Range循环和切片
前端·后端·学习·golang
WizLC2 小时前
【Java】各种IO流知识详解
java·开发语言·后端·spring·intellij idea
Victor3562 小时前
Netty(19)Netty的性能优化手段有哪些?
后端
爬山算法2 小时前
Netty(15)Netty的线程模型是什么?它有哪些线程池类型?
java·后端
白宇横流学长3 小时前
基于SpringBoot实现的冬奥会科普平台设计与实现【源码+文档】
java·spring boot·后端
Python编程学习圈4 小时前
Asciinema - 终端日志记录神器,开发者的福音
后端
bing.shao4 小时前
Golang 高并发秒杀系统踩坑
开发语言·后端·golang