C++中的公交路线
假设我们有一系列公交路线。在每条routes[i]中,都有一条第i辆公交车无限循环行驶的路线。所以,如果routes[0] = [1, 5, 7],这意味着第一辆公交车(索引为0)将按照1, 5, 7, 1, 5, 7, 1,...的顺序无限循环行驶。
现在假设我们从公交站S出发,最初不在任何公交车上,想要到达公交站T。我们需要找到到达目的地的最少乘车次数?如果无法到达,则返回-1。
例如,如果输入为[[1,2,8],[3,6,8]],S = 1,T = 6,则输出为2。先乘坐第一辆公交车到公交站8,然后乘坐第二辆公交车到公交站6。
为了解决这个问题,我们将遵循以下步骤:
- 定义一个映射m
- 对于i := 0,当i < r的大小,更新(i加1),执行:
- 对于j := 0,当j < r[i]的大小,更新(j加1),执行:
- 将i插入到m[r[i, j]]的末尾
- 对于j := 0,当j < r[i]的大小,更新(j加1),执行:
- 定义一个队列q,将S插入到q中
- 如果S等于T,则:
- 返回0
- 定义一个名为visited的集合
- 对于lvl := 1,当q不为空,更新(lvl加1),执行:
- sz := q的大小
- 当sz不为零时,执行:
- node := q的第一个元素,从q中删除该元素
- 对于i := 0,当i < m[node]的大小,更新(i加1),执行:
- route := m[node, i]
- 如果visited包含route,则:
- 忽略以下部分,跳到下一个迭代
- 将route插入到visited中
- 对于j := 0,当j < r[route]的大小,更新(j加1),执行:
- stop := r[route, j]
- 如果stop等于T,则:
- 返回lvl
- 将stop插入到q中
- sz减1
- 返回-1
让我们来看下面的实现来更好地理解:
示例
#include <bits/stdc++.h> using namespace std; class Solution { public: int numBusesToDestination(vector<vector<int>>& r, int S, int T) { unordered_map <int, vector <int> > m; for(int i = 0; i < r.size(); i++){ for(int j = 0; j < r[i].size(); j++){ m[r[i][j]].push_back(i); } } queue <int> q; q.push(S); if(S == T) return 0; unordered_set <int> visited; for(int lvl = 1; !q.empty(); lvl++){ int sz = q.size(); while(sz--){ int node = q.front(); q.pop(); for(int i = 0; i < m[node].size(); i++){ int route = m[node][i]; if(visited.count(route)) continue; visited.insert(route); for(int j = 0; j < r[route].size(); j++){ int stop = r[route][j]; if(stop == T) return lvl; q.push(stop); } } } } return -1; } }; main(){ Solution ob; vector<vector<int>> v = {{1,2,8}, {3,6,8}}; cout << (ob.numBusesToDestination(v, 1, 6)); }
输入
{{1,2,8}, {3,6,8}} 1 6
输出
2
广告