题意
给定数组routes,代表每一辆车能够到达哪些车站,求最少需要多少次中转我才能够到达终点
https://leetcode.com/problems/bus-routes/description/
routes = [[1,2,7],[3,6,7]], source = 1, target = 6
answer = 2
理论上我应该建立车站到车站,但是这个建立需要去重复并且结点数会很高,如果我建立车站和路线的邻接表,我不需要去重。
这个bfs每次都是把车站压进queue里,每次pop车站,根据路线放入站台。相同的路线我就不用重复计算了
class Solution {
public://本质是什么:bfs计算步数int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {if (source == target) {return 0;}unordered_map<int, unordered_set<int>> mp;unordered_set<int> vis;for(int i = 0; i < routes.size(); i++) {for(int pos: routes[i]) {mp[pos].insert(i);}}queue<int> q;for (auto& ele:mp[source]) {vis.insert(ele);for(auto& stop: routes[ele]) {q.push(stop);}}int ret = 0;while(!q.empty()) {int size = q.size();ret += 1;for(int i = 0; i < size; i++) {int node = q.front();q.pop();if(node == target) {return ret;}for (auto& ele:mp[node]) {if(vis.count(ele) > 0) continue;vis.insert(ele);for(auto& stop: routes[ele]) {q.push(stop);}}}}return -1;}
};