我正在尝试解决最短路径问题。 IT是一个古老的滑铁卢CCC问题,我正在为2019年练习。从本质上讲,这是一本“选择冒险家的书”,每页有N页(最多10000页),可以通往Ni页。第一个输入是N,然后有N行输入,其中第一个数字是到其他页面的分支数,然后是分支到的其他页面。如果为0,则为终点,并且没有其他分支。我们必须说明是否到达所有页面以及最短路径。样本输入和输出:
input:
3
2 2 3
0
1 1
output
Y
2
我能够解决问题,但我仍未通过时限测试。如何使我的代码更有效地通过时间测试?这是我用来避免循环并获得最短路径的递归方法。
public static void shortestPath(Page p, ArrayList<Page> list){
ArrayList<Page> currentList = new ArrayList<>();
for(Page pg : list){
currentList.add(pg);
}
p.visited = true;
if(p.paths.get(0) == 0){
currentList.add(p);
Paths temp = new Paths();
temp.aPath = currentList;
completedPaths.add(temp);
}else{
for(int i=0;i<p.paths.size();i++){
if(!currentList.contains(pages.get(p.paths.get(i) - 1))){
if(!currentList.contains(p)){
currentList.add(p);
}
shortestPath(pages.get(p.paths.get(i) - 1), currentList);
}
}
}
}