题目描述:
说明:
示例 1:
示例 2:
思路:
首先需要知道1号站可以坐哪些公交,这些公交都需要作为起点记录下来。依次尝试。
然后我们还需要一个站牌,能让我们知道,当前站可以选择哪些公交。
-
最后就可以开始一个一个尝试,并记录下已经选择过的车。
Queue<Integer> queue = new LinkedList();
Map<Integer, Integer> map = new HashMap();
Map<Integer, Set<Integer>> stopSign = new HashMap();
for (int i = 0; i < m; i++) {
for (int j = 0; j < routes[i].length; j++) {
if (source == routes[i][j]) {
queue.offer(i);
map.put(i, 1);
}
Set<Integer> set = stopSign.get(routes[i][j]);
if (set == null) {
set = new HashSet();
}
set.add(i);
stopSign.put(routes[i][j], set);
}
}
代码实现:
class Solution {
public int numBusesToDestination(int[][] routes, int source, int target) {
if (source == target) return 0;
return bfs(routes, source, target);
}
public int bfs(int[][] routes, int source, int target) {
int m = routes.length;
Queue<Integer> queue = new LinkedList();
Map<Integer, Integer> map = new HashMap();
Map<Integer, Set<Integer>> stopSign = new HashMap();
for (int i = 0; i < m; i++) {
for (int j = 0; j < routes[i].length; j++) {
if (source == routes[i][j]) {
queue.offer(i);
map.put(i, 1);
}
Set<Integer> set = stopSign.get(routes[i][j]);
if (set == null) {
set = new HashSet();
}
set.add(i);
stopSign.put(routes[i][j], set);
}
}
while (!queue.isEmpty()) {
int start = queue.poll();
int num = map.get(start);
for (int i = 0; i < routes[start].length; i++) {
if (routes[start][i] == target) {
return num;
}
Set<Integer> set = stopSign.get(routes[start][I]);
for (Integer station : set) {
if (!map.containsKey(station)) {
queue.offer(station);
map.put(station, num + 1);
}
}
}
}
return -1;
}
}