LeetCode 815 公交线路[BFS Map] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 815 公交线路[BFS Map] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
解题思路:
仍然是使用标准的BFS解题模板,但是与单纯的点集中不同方向遍历不同,这种线路遍历相当于行式遍历,所以既然能把一整行都遍历了,不如访问数组就设置为行的访问,即线路的访问,这样的方式比点的访问占用空间更小,且不用考虑一个点可以被很多条线路访问的情况。这道题还需要使用到Map,目的是统计经过同一个点的线路有哪些,代码的注释已经很详尽了,思路可以简述为:

  1. 定义标记站点出现的线路的Map并初始化,定义队列并初始化(放入的是站点);
  2. 根据Map遍历队列中处于同一状态点所经过的线路,如果有target直接返回当前状态(状态代表处于第几辆车),访问完一个线路标记访问过;
  3. 循环2直到队列中没有站点,如果还没访问到说明无法到达目的地。

代码如下:

class Solution {
public:
    int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {
        // 如果起点终点相同
        if(source == target) {
            return 0;
        }
        // 标记站点出现的线路
        unordered_map<int, vector<int>> mp;
        // 标记访问的线路
        vector<bool> visited(routes.size(), false);
        // 记录站点出现的线路
        for(int i = 0; i < routes.size(); i ++) {
            for(int j = 0; j < routes[i].size(); j ++) {
                mp[routes[i][j]].push_back(i);
            }
        }
        // 定义队列并初始化
        queue<int> q;
        q.push(source);
        int step = 0;
        while(!q.empty()) {
            step ++;
            int len = q.size();
            for(int i = 0; i < len; i ++) {
                int site = q.front();
                q.pop();
                for(int& r : mp[site]) {
                    if(!visited[r]) {
                        for(int j = 0; j < routes[r].size(); j ++) {
                            if(routes[r][j] == target) {
                                return step;
                            }
                            q.push(routes[r][j]);
                        }
                        visited[r] = true;
                    }
                }
            }
        }
        return -1;
    }
};


/*作者:heroding
链接:https://leetcode-cn.com/problems/bus-routes/solution/cbfs-mapxiang-jie-by-heroding-9we4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

以上是关于LeetCode 815 公交线路[BFS Map] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

[Hbfs] lc815. 公交路线(建图+多源bfs+bfs最短路+思维+好题)

[LeetCode] 815. 公交路线

[LeetCode] Bus Routes 公交线路

ACM/ICPC 之 BFS范例(ZOJ2913)

高德地图——切换路线的不同实现(驾车公交骑行)

[最短路] aw920. 最优乘车(单源最短路建图+bfs最短路模型+知识理解+好题)