LeetCode 815 公交线路[BFS Map] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 815 公交线路[BFS Map] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
仍然是使用标准的BFS解题模板,但是与单纯的点集中不同方向遍历不同,这种线路遍历相当于行式遍历,所以既然能把一整行都遍历了,不如访问数组就设置为行的访问,即线路的访问,这样的方式比点的访问占用空间更小,且不用考虑一个点可以被很多条线路访问的情况。这道题还需要使用到Map,目的是统计经过同一个点的线路有哪些,代码的注释已经很详尽了,思路可以简述为:
- 定义标记站点出现的线路的Map并初始化,定义队列并初始化(放入的是站点);
- 根据Map遍历队列中处于同一状态点所经过的线路,如果有target直接返回当前状态(状态代表处于第几辆车),访问完一个线路标记访问过;
- 循环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之路的主要内容,如果未能解决你的问题,请参考以下文章