输入:int[][] routes routes[i]表示第i号公交车的运行线路。如果routes[i]={1,3,5}。说明公交车运行线路是1->3->5。
   int S:表示起始站点
   int T:表示目的站点
输出:从S到T最少需要几辆公交车。
规则:一开始人没有坐在公交车上,出行方式只用公交车。
分析:很自然的想到以各个站点为节点,站点之间从上一站到下一站作为线。每个站点添加个list维护这个站点属于哪些公交车。
 这样的想法很自然,很惯性,确没有什么用。因为要找的是公交车数量的最小值,所以应该重点关注如何从一个公交车跳转到另外一个公交车。直到调到包含T的公交车上。
学习1:官方的solution
 把公交车看做是图的节点。要返回最少的公交车数量,就是一个最短路径问题。
 如果两个公交车至少有一个站是相同的,那这两个公交车之间有连线。
 从起始站开始BFS遍历图,直到遇到目标站。
 一个站可能在多个公交车里面有,所以起始队列和终点目标都是多个的。
 这里发现BFS总能解决最短路径问题。;例如847,也是最短路径,也用了BFS。

public int numBusesToDestination(int[][] routes, int S, int T) {//构建图Map<Integer, List<Integer>> graph = new HashMap<Integer,List<Integer>>();int N = routes.length;for(int i=0;i<N;i++){Arrays.sort(routes[i]);graph.put(i,new ArrayList<Integer>());}for(int i=0;i<N;i++){for(int j = i+1;j<N;j++){if(intersection(routes[i],routes[j])){graph.get(i).add(j);graph.get(j).add(i);}}}//遍历Queue<Point> queue = new ArrayDeque<>();Set<Integer> seen = new HashSet<>();List<Integer> targets = new ArrayList<>();for(int i=0;i<N;i++){if(Arrays.binarySearch(routes[i],S)!=-1){queue.offer(new Point(i,0));seen.add(i);}if(Arrays.binarySearch(routes[i],T)!=-1){targets.add(i);}}while(!queue.isEmpty()){Point point = queue.poll();int node = point.x;int depth = point.y;if(targets.contains(node)){return depth+1;}else{for(Integer next : graph.get(node)){if(!seen.contains(next)){seen.add(next);queue.offer(new Point(next,depth+1));}}}}return -1;}/*** 判断两个数组是否有交集* @param a* @param b* @return*/private boolean intersection(int[] a,int[] b) {int i = 0;int j = 0;while(i<a.length && j<b.length){if(a[i]==b[j]) return true;if(a[i]<b[j]){i++;}else{j++;}}return false;}

学习2:如果把公交站点看做图中的节点也是可以的。但是不是以公交车的线路作为连线的。而是一次访问了一辆公交车上所有的站点。理解起来不如上面的解法。

/*** https://leetcode.com/problems/bus-routes/discuss/122712/Simple-Java-Solution-using-BFS* 我一定认为要按照公交车的行驶顺利遍历站点。* 如果roets[0]={1,5,7},如果从5开始,那么1,7可以同时加入队列,因为只要在这辆公交车内不管走多少遍,都是1辆公交车。题目需求求解的也是最少公交车数量,不是站点数量。* @param routes* @param S* @param T* @return*/public int numBusesToDestination(int[][] routes, int S, int T) {if(S==T) return 0;Map<Integer,List<Integer>> map = new HashMap<Integer, List<Integer>>();for(int i=0;i<routes.length;i++){for(int j=0;j<routes[i].length;j++){List<Integer> busList = map.getOrDefault(routes[i][j],new ArrayList<>());busList.add(i);map.put(routes[i][j],busList);}}Queue<Integer> queue = new ArrayDeque<>();queue.offer(S);Set<Integer> seen = new HashSet<>();int level = 0;while(!queue.isEmpty()){int size = queue.size();level++;for(int i=0;i<size;i++){int stop = queue.poll();if(stop == T) return level;for(int bus : map.get(stop)){if(seen.contains(bus)) continue;seen.add(bus);for(int j=0;j<routes[bus].length;j++){queue.offer(routes[bus][j]);}}}}return -1;}

代码1

代码2

815. Bus Routes相关推荐

  1. [Leetcode] Bus Routes 公交线路

    Bus Routes 详细解题思路请访问:https://yanjia.me/zh/2018/11/... We have a list of bus routes. Each routes[i] i ...

  2. Leetcode815.公交线路 Bus Routes(Java)

    Leetcode815.公交线路 Bus Routes(Java) ##BFS## 广度优先搜索 2021-03 阿里春招题目 该题应该为图论题,边有权值的情况下寻找最短路径,采用多源BFS解决 示例 ...

  3. HDU 5552 Bus Routes(2015合肥现场赛A,计数,分治NTT)

    题意  给定n个点,任意两点之间可以不连边也可以连边.如果连边的话可以染上m种颜色. 求最后形成的图,是一个带环连通图的方案数. 首先答案是n个点的图减去n个点能形成的树. n个点能形成的树的方案数比 ...

  4. HDU 5552 Bus Routes(NTT+分治)

    题意 给定 \(n\) 个点,任意连边,每条边有 \(m\) 种颜色可选,求带环连通图的方案数. \(1\leq n\leq 10000\) \(1\leq m < 2^{31}\) 思路 直接 ...

  5. leetcode 题解 (500-1000题,持续更新,part 2)

    part1(1-500), part3(1000-*) 502. IPO 题意:给定k,w,profits数组和capital数组.k表示最多可完成的任务数.w是初始资本.profits是各个任务的收 ...

  6. LeetCode All in One 题目讲解汇总(持续更新中...)

    原文地址:https://www.cnblogs.com/grandyang/p/4606334.html 终于将LeetCode的大部分题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开 ...

  7. BZOJ1354: [Baltic2005]Bus Trip

    题解:  首先把原图扣除了  原来的边变成点 点权为ci-bi  我们连边时当且仅当x的入边的di小于x的出边的ai是两条线路能连边 这样子的边是m^2的不满足要求 我们考虑建一排虚点  对于x的出边 ...

  8. cf----2019-09-22(Chocolates,Serval and Bus, Polycarp Restores Permutation)

    明若清溪天下绝歌 缱绻成说,不知该在哪处着墨:一生情深怎奈何世事 徒留斑驳,只一念痴恋成奢. You went to the store, selling nn types of chocolates ...

  9. PoPo数据可视化第9期

    PoPo数据可视化 聚焦于Web数据可视化与可视化交互领域,发现可视化领域有意思的内容.不想错过可视化领域的精彩内容, 就快快关注吧 :) 2018 in the Ito Design Lab (视频 ...

最新文章

  1. cuDNN error: CUDNN_STATUS_INTERNAL_ERROR
  2. 高斯噪声、高斯白噪声解析
  3. 【中级软考】MTBF是什么?(平均故障间隔时间,Mean Time Between Failure,是衡量一个产品的可靠性指标,单位为小时)
  4. linux下运行hadoop,Linux环境下hadoop运行平台的搭建
  5. 求数组中数对的最大值
  6. Codeforces 757B - Bash's Big Day(分解因子+hashing)
  7. 基于docker在Ubuntu上搭建TensorFlow-GPU计算环境
  8. 4.3Python数据处理篇之Matplotlib系列(三)---plt.plot()折线图
  9. 推荐两个漂亮的编程字体
  10. mysql 快速初始化_MySQL中的批量初始化数据的对比测试(r12笔记第71天)
  11. 无界面chrome + selenium爬虫
  12. php与mysqli,如何通过PHP与MySQLi保持联系
  13. 【sklearn第四讲】数据集变换
  14. swift 系统自带的约束使用
  15. python贴吧-python爬取贴吧帖子
  16. Ubuntu网络下载速度慢解决方法
  17. 开源生态研究与实践| ChinaOSC
  18. 腾讯游戏客户端一面准备
  19. 微信小游戏马甲包过审(马甲包过包)
  20. QBXT 2018春季DP图论班 2018.5.4 --- 树形DP

热门文章

  1. 第一次冲刺阶段(三)
  2. HDU 1402 A * B Problem Plus FFT
  3. 做移动端视频通话软件,大致看了下现有的开源软件(转)
  4. php 路由 隐藏index,CI中路由与伪静态、隐藏index.php(十四)
  5. 批处理 java环境_java环境配置简单批处理方法一键OK
  6. Python爬虫自学之第(②)篇——BeautifulSoup解析网页
  7. main.js中封装全局登录函数
  8. Android 2017-2018面试题详解
  9. 微信公众号开发 重要 access_token {errcode:40164,errmsg:invalid ip 114.221.159.11, not in whitelist hint:
  10. div添加html链接,DIV添加超链接小记