LeetCode 815. 公交路线(最少换乘,BFS)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 815. 公交路线(最少换乘,BFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
我們有一系列公交路線。每一條路線 routes[i] 上都有一輛公交車在上面循環行駛。
例如,有一條路線 routes[0] = [1, 5, 7],表示第一輛 (下標為0) 公交車會一直按照 1->5->7->1->5->7->1->… 的車站路線行駛。
假設我們從 S 車站開始(初始時不在公交車上),要去往 T 站。
期間僅可乘坐公交車,求出最少乘坐的公交車數量。
返回 -1 表示不可能到達終點車站。
來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/bus-routes
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
class Solution { public:int numBusesToDestination(vector<vector<int>>& routes, int S, int T) {if(S == T)//哈哈,又被坑了return 0;unordered_map<int,unordered_set<int>> station_line;//站點,線路unordered_map<int,unordered_set<int>> line_station;//線路,站點queue<int> q;//線路隊列int n = routes.size(), line, station, step = 1, size;unordered_set<int> visitedStation;unordered_set<int> visitedLine;for(int i = 0, j; i < n; ++i){for(j = 0; j < routes[i].size(); ++j){station_line[routes[i][j]].insert(i);line_station[i].insert(routes[i][j]);if(routes[i][j] == S){q.push(i);//起點站的線路,都放進隊列visitedStation.insert(S);visitedLine.insert(i);}}}while(!q.empty()){size = q.size();while(size--){line = q.front();q.pop();if(line_station[line].count(T))return step;//線路包含終點,返回for(auto st = line_station[line].begin(); st != line_station[line].end(); ++st){ //查找這條線路經過的所有站if(!visitedStation.count(*st)){ //沒訪問過的站visitedStation.insert(*st);for(auto l = station_line[*st].begin(); l != station_line[*st].end(); ++l){ //這個站的所有未訪問線路if(!visitedLine.count(*l)){q.push(*l);visitedLine.insert(*l);}}}}}step++;}return -1;} };444 ms 59.5 MB
總結
以上是生活随笔為你收集整理的LeetCode 815. 公交路线(最少换乘,BFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 346. 数据流中的移
- 下一篇: LeetCode 684. 冗余连接(并