您的位置:首页 > 其它

公交车站 --- lintcode825

2018-03-14 20:17 190 查看
点击打开原题
已知:
有各种各样的公交车路线,给定起点站点和终点站点,求最少换乘的次数,如果无法到达就返回-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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  公交转乘