题目:815. 公交路线
思路:用哈希表mp来存储每个站点能在哪些路线出现,再进行广度优先搜索bfs,每个站点只需遍历一次。时间复杂度为0(10^5),细节看注释。
class Solution {
public:
int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {
if(source==target) return 0;
//哈希表mp来存储每个站点能从哪些路线出现
unordered_map<int,vector<int>> mp;
//遍历所有路线
for(int i=0;i<routes.size();i++){
//遍历路线的所有站点
for(auto x:routes[i]){
//将路线插入到站点的哈希表mp当中
mp[x].push_back(i);
}
}
//如果没有路线到达起始点\终点
if(mp[source].size()==0||mp[target].size()==0) return -1;
//队列,进行广度优先搜索bfs
queue<int> qu;
//记录到站点的距离
unordered_map<int,int> dis;
//初始化
dis[source]=0;
qu.push(source);
//广度优先搜索bfs
while(qu.size()){
//队首元素
int x=qu.front();
qu.pop();
//遇到终点栈
if(x==target) break;
//遍历能从站点x出发的路线
for(auto a:mp[x]){
//遍历路线上的所有站点
for(auto b:routes[a]){
//站点出现过,就没必要在插入了,毕竟找最少
if(dis.count(b)) continue;
dis[b]=dis[x]+1;
qu.push(b);
}
//遍历过的路线就置空,毕竟已经遍历过一遍,没必要再多跑一趟
routes[a].clear();
}
}
return dis.count(target)?dis[target]:-1;
}
};