给你一个数组 routes ,表示一系列公交线路,其中每个 routes[i] 表示一条公交线路,第 i 辆公交车将会在上面循环行驶。
例如,路线 routes[0] = [1, 5, 7] 表示第 0 辆公交车会一直按序列 1 -> 5 -> 7 -> 1 -> 5 -> 7 -> 1 -> ... 这样的车站路线行驶。
现在从 source 车站出发(初始时不在公交车上),要前往 target 车站。 期间仅可乘坐公交车。
求出 最少乘坐的公交车数量 。如果不可能到达终点车站,返回 -1 。
示例 1:
输入:routes = [[1,2,7],[3,6,7]], source = 1, target = 6
输出:2
解释:最优策略是先乘坐第一辆公交车到达车站 7 , 然后换乘第二辆公交车到车站 6 。
示例 2:
输入:routes = [[7,12],[4,5,15],[6],[15,19],[9,12,13]], source = 15, target = 12
输出:-1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bus-routes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {
if (source == target) {
return 0;
}
int n = routes.size(); //n条路线
vector<vector<bool>> g(n, vector<bool>(n)); //g[i][j],路线i与路线j相连
unordered_map <int, vector<int>> mp; //mp[i],经过站i的所有路线
// 建图,把路线当做点
for (int i = 0; i < n; i++) {
for (auto site : routes[i]) {
mp[site].push_back(i);
}
}
for (int i = 0; i < n; i++) {
for (auto site : routes[i]) {
for (auto j : mp[site]) {
g[i][j] = g[j][i] = true;
}
}
}
vector<int> dis(n, -1); // dis[i] 从起始路线到路线i的最短距离
queue <int> q;
// 把起始点所在的路线扔进queue
for (auto route : mp[source]) {
dis[route] = 1;
q.push(route);
}
// bfs计算从起始点所在路线到其他路线的最短距离
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v = 0; v < n; v++) {
if (g[u][v] && dis[v] == -1) {
dis[v] = dis[u] + 1;
q.push(v);
}
}
}
// 遍历终点所在的所有路线,找出距离最近的那条
int ans = INT_MAX;
for (auto route : mp[target]) {
if (dis[route] != -1) {
ans = min(ans, dis[route]);
}
}
return ans == INT_MAX ? -1 : ans;
}
};