题目地址:
https://leetcode.com/problems/bus-routes/
给定一个二维数组,每一行是一个公交车路线的每一个车站的编号。再给定两个车站的编号 S S S和 T T T,问从 S S S到 T T T至少坐多少个不同的公交车。
思路是BFS。先开一个哈希表 m m m,存储每个车站所在的公交路线的下标,这样就可以通过这个哈希表找到某个车站能到达哪些车站。接着BFS,再开一个哈希表 v v v记录哪些路线已经被访问过。将起点入队,然后通过 m m m找到乘这辆车能到达哪些路线,如果某个路线的车之前已经被乘过了,就略过;否则标记这条路线为已经访问过,并遍历这条路线上的所有车站,如果找到了终点就返回答案,否则将这个车站入队。每次通过一个车站扩展完其所在的所有路线之后,就可以在 m m m中把这个车站删掉了,因为这个车站以后再也不会用到了。代码如下:
class Solution {
public:
int numBusesToDestination(vector<vector<int>>& v, int s, int t) {
if (s == t) return 0;
// mp[x]:x属于哪些线路
unordered_map<int, unordered_set<int>> mp;
queue<int> q;
unordered_set<int> vis;
for (int i = 0; i < v.size(); i++)
for (int x : v[i]) {
if (x == s) {
q.push(i);
vis.insert(i);
}
mp[x].insert(i);
}
int res = 0;
while (q.size()) {
res++;
for (int i = q.size(); i; i--) {
int id = q.front(); q.pop();
for (int x : v[id]) {
if (x == t) return res;
if (mp.count(x)) {
for (int y : mp[x]) {
if (vis.count(y)) continue;
vis.insert(y);
q.push(y);
}
mp.erase(x);
}
}
}
}
return -1;
}
};
时空复杂度 O ( n ) O(n) O(n), n n n为车站个数。