首页 > 其他分享 >AcWing 920. 最优乘车 (抽象建图 + bfs

AcWing 920. 最优乘车 (抽象建图 + bfs

时间:2023-11-26 14:46:30浏览次数:40  
标签:路线 int bfs 建图 static 巴士 920 new

package 算法提高课;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class acw920 {

    /**
     * 本题的建图方式 :
     *        我们对于每一个巴士路线进行观察, 发现从前面的站走向这一条巴士路线后面的站是不用换站的, 所以我们就认为前面的站到后面的站之间是有边的, 设边权为1
     *         => 注意这里设边权为1的含义, 比如 : 从a -> b 边权是1, 意味着我从a到b经过了一条巴士路线
     *        将所有的巴士路线都处理好以后, 图中就只有边权为1的路线, 此时我们可以使用bfs来解这道题
     *        注意最终d[i]代表我从1 -> i路上总共经历了几条巴士路线, 但开头的一条路线不是换乘上来的, 所以答案是d[i] - 1
     *
     *        这里文字描述的可能并没有那么直观, 不明白建图的话可以再看一遍视频回忆一下
     * */
    static int m, n;
    static boolean[][] g;
    static int[] d;
    static int[] stop;

    private static void init() {
        g = new boolean[n + 10][n + 10]; stop = new int[n + 10]; d = new int[n + 10];
        Arrays.fill(d, -1);
    }

    private static void bfs() { // 初始化
        Queue<Integer> q = new LinkedList<>();
        d[1] = 0;
        q.add(1);

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

            for (int i = 1; i <= n; i ++ )
                if (g[t][i] && d[i] == -1) { // bfs板子, 如果一个点可以走并且没被走过, 那就更新他 (入队时答案最优
                    d[i] = d[t] + 1;
                    q.add(i);
                }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        m = sc.nextInt(); n = sc.nextInt();
        init();

        sc.nextLine(); // 吸收掉换行符
        // 下面的输入问题非常蛋疼, 我们需要手动再开一个从str读入的Scanner
        for (int i = 1; i <= m; i ++ ) {
            int idx = 0;
            String str = sc.nextLine();
            Scanner sin = new Scanner(str);
            while (sin.hasNext()) stop[idx ++ ] = sin.nextInt();
            for (int j = 0; j < idx; j ++ )
                for (int k = j + 1; k < idx ; k ++ )
                    g[stop[j]][stop[k]] = true; // 建图
        }

        bfs();

        if (d[n] == -1) System.out.println("NO");
        else System.out.println(d[n] - 1); // 注意答案是边数减1
    }
}

标签:路线,int,bfs,建图,static,巴士,920,new
From: https://www.cnblogs.com/llihaotian666/p/17857177.html

相关文章

  • AcWing 903. 昂贵的聘礼 (超级源点 + 等级限制 + 抽象建图
    package算法提高课;importjava.util.Arrays;importjava.util.Scanner;publicclassacw903{staticintm,n;staticint[]dis,level;staticboolean[]st;staticint[][]g;/**思路:首先用到了虚拟源点,加入了等级限制*......
  • 线段树优化建图
    CF786B题意:定义\((u,v,w)\)表示\(u\)向\(v\)连了边权为\(w\)的边。有三种连边操作\((u,v,w)\)\(\foralli\in[l,r],(u,i,w)\)\(\foralli\in[l,r],(i,u,w)\)求最短路。暴力加边是\(O(nm)\)的,考虑优化。可以把图建到线段树上,线段树每个结点向左右儿子连\(w......
  • 01bfs
    今天写一个最短路题边权为\(0\)或\(1\),我说这不一眼\(dij\)么?结果题解区全部写的\(O(n+m)\)的\(01bfs\)。好家伙我居然一直不知道这么个东西,花了一个小时看会了,写一下原理。实现的方法很简单,就是一个双端队列,去\(nm\)的\(deque\),我有手,可以手写。在这里讲一下正确......
  • DFS和BFS
    DFS: acwing842递归搜索树 1#include<iostream>2usingnamespacestd;34constintN=10;5intn;6intpath[N];7boolst[N];89voiddfs(intu)10{11if(u==n)//一个分支走到头12{13for(inti=0;i<n;i++)......
  • BFS
    鸣人与佐助佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置。地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这些位置。鸣人有一定数量的查克拉,每一个单位的查克拉可以打败一......
  • DFS、BFS模板
    目录DFSBFSDFS处理当前节点的位置不同对应着不同的遍历defpreorderTraversal(root):ifnotroot:returnprint(root.val)#前序遍历,处理当前节点preorderTraversal(root.left)#递归遍历左子树print(root.val)#中序遍历,处理当前节点pr......
  • 群辉NAS DS920+ M.2缓存改存储盘
    1.准备阶段开启远程SSH端口,并连接至群辉NAS 连接SHH,进入后输入sudo-i切换为root模式 2.删除原有的SSD缓存 3.查看磁盘命令#查看所有磁盘ls/dev/nvme*#查看具体的磁盘,这里nvme0n1以及nvme1n1都为缓存盘fdisk-l/dev/nvme0m1 4.创建缓存分区......
  • 迭代加深,双向搜索,IDA*,A*,双端队列BFS
    迭代加深://迭代加深搜索//给搜索设定一个范围,如果在这个范围内没有答案那么再加大搜索范围//这么做是为了防止搜索过深,导致利用大量时间搜索无用信息//如果当前搜索是第10位,搜索的是个二叉树,那么前9个就是2^0+2^1+2^2+..+2^9=2^10-1,所以时间复杂度并没增大太多//htt......
  • Opencv中goodFeaturesToTrack函数(Harris角点、Shi-Tomasi角点检测)算子速度的进一步
    搜索到某个效果很好的视频去燥的算法,感觉效果比较牛逼,就是速度比较慢,如果能做到实时,那还是很有实用价值的。于是盲目的选择了这个课题,遇到的第一个函数就是角点检测,大概六七年用过C#实现过Harris角点以及SUSAN角点。因此相关的理论还是有所了解的,不过那个时候重点在于实现,对于......
  • 字符串、线性表、队列、栈、哈希表、dfs、bfs
    题目列表:1.字符串无重复字符的最长子串(中等难度)给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。AC代码,展开查看classSolution{public:intlengthOfLongestSubstring(strings){intres=0;unordered_map<char,int>heap......