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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HERODING77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值