公交车站 --- 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;
}
}
已知:
有各种各样的公交车路线,给定起点站点和终点站点,求最少换乘的次数,如果无法到达就返回-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;
}
}
相关文章推荐
- 小混混公交车站行凶 一中学生胸中两刀受重伤
- 菲律宾南部一公交车站发生爆炸事件[组图]
- 情缘公交车站
- 韩国首尔公交车站将被指定为禁烟场所
- 首尔公交车站将全部禁烟
- BZOJ2167 : 公交车站
- 旧金山抗议者递交诉状,禁止科技公司班车使用公交车站
- bzoj 2167: 公交车站
- 公交车站将加装避雷装置
- 世界上最美丽的公交车站
- 【效果设计】模拟公交车站站台显示
- 北京十佳公交站出炉 37个车站被市民亮黄牌
- 克罗地亚企业寻求中国产公交车站候车亭
- 白领的一天:公交车站上如何与老外搭讪
- 一怒之下做了个基于微信公众平台结合百度地图的查公交应用!轻量!方便!快捷!
- 武汉市公交站点区域性分析
- 公交查询系统测试计划
- UVA 1349 Optimal Bus Route Design 最优公交路线(最小费用流,拆点)
- 多终点的公交路线
- codevs 3294 车站分级