lintcode 825 · 公交车站 【hard vip BFS 和普通的BFS不同的是,本题目需要构建2个图,用map表示】

题目

https://www.lintcode.com/problem/825/

现在有一个城市的 N 个公车信息,route[i] 储存着第 i 辆公交车经过的公交车站,请你求车站 A 到车站 B 的最少换乘,如果无法从车站 A 到达车站 B 返回 -11 <= N <= 100, 2 <= |route[i]| <= 100, 0 <= route[i][j] <= 2^31 - 1
AB 两个车站一定存在,且不相等
样例
样例1

输入:
N = 2
route = [[1, 2, 3, 4], [3, 5, 6, 7]]
A = 1
B = 4
输出: 1
说明:
我们只需要坐公车 0 号,就可以从车站 1 到达车站 4。
样例2

输入:
N = 2
route = [[1,2,3,4],[3,5,6,7]]
A = 1
B = 7
输出: 2
说明:
我们需要从车站 1 坐公车 0 号,然后在车站 3 换乘公车 1 号到达车站 6

思路,前置知识

	 BFS. 用队列,宽度优先遍历(BFS),第一次访问到B站的即为最短换乘次数;

代码

public class Solution {
    /**
     * @param n: The number of buses
     * @param route: The route of buses
     * @param a: Start bus station
     * @param b: End bus station
     * @return: Return the minimum transfer number
     */
    public int getMinTransferNumber(int n, int[][] route, int a, int b) {
          //使用队列,宽度优先遍历(BFS),第一次访问到B站的即为最短换乘次数;
        Map<Integer, List<Integer>>  stop = new HashMap<>(),
                car = new HashMap<>(); //车站map,车map
        for (int i = 0; i <route.length ; i++) {
            for (int j = 0; j <route[i].length ; j++) {
                int s = route[i][j]; //车站
                int c =i; //车

                if(!stop.containsKey(s))
                    stop.put(s,new ArrayList<>());
                stop.get(s).add(c);

                if(!car.containsKey(c))
                    car.put(c,new ArrayList<>());
                car.get(c).add(s);
            }
        }

        Queue<Integer> q = new LinkedList<>();
        Set<Integer> visited = new HashSet<>(); //记录是否访问过此车站
        q.add(a);
        visited.add(a);
        int steps =0;
        while(!q.isEmpty()){

            steps++;
            int size = q.size();
            for (int i = 0; i <size ; i++) {
                int curstop = q.poll();
                if(curstop == b) return steps-1;
                for (int sp : stop.get(curstop)) {
                    for (int c : car.get(sp)) {
                        if(visited.contains(c)) continue;
                        q.add(c);
                        visited.add(c);
                    }
                }
            }
        }

        return -1;
    }

}

你可能感兴趣的:(宽度优先,算法)