题目链接
如果起点和终点相同,那么需要乘坐的公交车是 0;
查找起点,将起点是从哪条公交路线来的入队,记录每个车站都由那几条公交路线会经过
BFSBFS 查找起点的路线都经过哪些车站,如果找到当前经过的车站是目标车站则返回 dis数组的记录值
如果当前经过的车站不是目标车站,遍历当前车站会有哪些路线经过,更新最短路,再将和当前车站有交集
的路线入队,遍历完后删除当前路线中有交点的车站点,整个 BFSBFS 都无法到达终点则返回 -1。
class Solution {
public:
int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {
if(source == target) return 0;
int n = routes.size();
unordered_map<int,vector<int> >g;
vector<int> dis(n,1e9);
queue<int> q;
for(int i = 0; i < n; i++){
for(auto x : routes[i]){
if(x == source) {
dis[i] = 1;
q.push(i);
}
g[x].push_back(i);
}
}
while(!q.empty())
{
int now = q.front();
q.pop();
for(auto& x : routes[now])
{
if(target == x) return dis[now];
for(auto& y : g[x]){
if(dis[y] > dis[now] + 1){
dis[y] = dis[now] + 1;
q.push(y);
}
}
g.erase(x);
}
}
return -1;
}
};