公交车站 --- lintcode825

点击打开原题

已知:

有各种各样的公交车路线,给定起点站点和终点站点,求最少换乘的次数,如果无法到达就返回-1


思路:

首先找到所有包含初始站点的公交车,再找到所有包含结束站点的公交车,将两者送入函数处理,获取最少转乘次数。如果找到转乘次数为1的,则直接返回1,如果找不到,就计算转乘次数为2的情况(假设从公交车a能转乘到b,则返回2)。如果还不行,则计算转乘为3的情况(假设包含七点的公交a能到达bcd,查看bcd中是否有能到包含终点的公交e的),依次类推


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) {
		List<Integer> start = new ArrayList<Integer>();
		List<Integer> end = new ArrayList<Integer>();
		for (int i = 0; i < route.length; i++) {
			if (contain(route[i], A)) {
				start.add(i);
			}
			if (contain(route[i], B)) {
				end.add(i);
			}
		}

		int ret = 101;
    	        for (int i : start) {
			for (int j : end) {
				int temp = calculate(i, j, route);
				if (temp == -1) {
					continue;
				} else {
					if (temp == 1) {
						return 1;
					}
					if (ret > temp) {
						ret = temp;
					}
				}
			}
		}

		if (ret == 101) {
			return -1;
		}

		return ret;
	}

	private int calculate(int i, int j, int[][] route) {
		if (i == j) {
			return 1;
		}

		List<Integer> list = new ArrayList<Integer>();
		list.add(i);
		int start = 0;
		int end = 1;
		for (int ret = 2; ret <= 100; ret++) {

			for (int itemp = 0; itemp < route.length; itemp++) {
				if (list.contains(itemp)) {
					continue;
				}
				for (int jtemp = start; jtemp < end; jtemp++) {
					if (connect(route[itemp], route[list.get(jtemp)])) {
						list.add(itemp);
						break;
					}
				}
			}

			if (list.contains(j)) {
				return ret;
			}

			start = end;
			end = list.size();
			if (start == end) {
				return -1;
			}
		}

		return -1;
	}

	private boolean connect(int[] i, int[] j) {
		for (int num1 : i) {
			for (int num2 : j) {
				if (num1 == num2) {
					return true;
				}
			}
		}
		return false;
	}

	private boolean contain(int[] route, int site) {
		for (int i : route) {
			if (i == site) {
				return true;
			}
		}
		return false;
	}
}

猜你喜欢

转载自blog.csdn.net/mio_bass/article/details/79559610