题解 | #公交车#bfs模拟

公交车

https://www.nowcoder.com/practice/630816b6884f4ad49590b6c07bab40fc

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    static List<List<Integer>> graph;  // 存放的是每个公交车经过的站台列表
    static List<List<Integer>> zhanTai; // 存放的是每个站台有哪些公交车经过
    static boolean[] visited;  // 用于标记每个站台是否访问过
    static boolean[] used;     // 用于标记每个公交车是否使用过
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int n = sc.nextInt();
            int m = sc.nextInt();
            graph = new ArrayList<>();
            zhanTai = new ArrayList<>();
            visited = new boolean[n + 1];
            used = new boolean[m + 1];
            for (int i = 0; i <= m; i++) {
                graph.add(new ArrayList<>());
            }
            for (int i = 0; i <= n; i++) {
                zhanTai.add(new ArrayList<>());
            }
            for (int i = 1; i <= m; i++) {
                int k = sc.nextInt();
                for (int j = 0; j < k; j++) {
                    graph.get(i).add(sc.nextInt());
                }
            }
            // System.out.println(graph);
            for (int i = 0; i < graph.size(); i++) {
                if (!graph.get(i).isEmpty()) {
                    for (Integer integer : graph.get(i)) {
                        zhanTai.get(integer).add(i);
                    }
                }
            }
            // System.out.println(zhanTai);
            //存放每个站台的公交车
            ArrayDeque<int[]> queue = new ArrayDeque<>();
            //这个是站台1的公交车
            for (Integer bus : zhanTai.get(1)) {
                queue.add(new int[] {1, bus});
            }
            int cost = 0;
            while (!queue.isEmpty()) {
                int size = queue.size();
                cost++;
                while (size-- > 0) {
                    int[] temp = queue.poll();
                    int busTai = temp[0];//拿到当前站台
                    int bus = temp[1];//拿到当前站台对应公交车
                    if (used[bus]) continue;
                    used[bus] = true;//记录公交车已坐过
                    List<Integer> zhanTaiS = graph.get(bus);//拿到这个公交车经过的站台
                    for (Integer tai : zhanTaiS) {
                        if (tai == n) {//如果能到达就直接返回
                            System.out.println(cost);
                            return;
                        }
                    }
                    visited[busTai] = true; // 标记当前站台为已访问
                     // 对于该公交车经过的每个站台,获取该站台的所有公交车并加入队列
                    for (Integer tai : zhanTaiS) {
                        if (!visited[tai]) { // 如果该站台未被访问过
                            for (Integer car : zhanTai.get(tai)) {
                                queue.add(new int[] {tai, car}); // 将新的{站台, 公交车}加入队列
                            }
                        }
                    }
                }
            }
            System.out.println(-1);
        }
    }
}

全部评论

相关推荐

object3:开始给部分🌸孝子上人生第一课了
点赞 评论 收藏
分享
11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务