2 回答
TA贡献1921条经验 获得超9个赞
最简单的方法是跟踪每个节点的前身。到达结束节点后,您可以回溯以找出您来自哪里。
添加初始化
int [] comeFrom = new int[vertices];
改变
if(newKey<distance[vertexV])
distance[vertexV] = newKey;
自
if(newKey<distance[vertexV]) {
distance[vertexV] = newKey;
comeFrom[vertexV] = vertexU;
}
以及打印输出时
List<Integer> path = new ArrayList();
int pos = LocationOfChosenUser;
while(pos != sourceVertex) {
path.add(pos);
pos = comeFrom[pos];
}
for (int i=path.size()-1; i>=0; i--) {
System.out.print(path.get(i));
if (i > 0) System.out.print(" -> ");
}
TA贡献1780条经验 获得超5个赞
每次更新距离数组时,都需要跟踪到达节点的路径。这可以通过多种方式完成,我建议使用一个数组来存储为在距离数组中实现距离而采取的步骤。
distance[vertexV] = newKey;
lastStep[vertexV] = vertexU;
算法完成后,可以将路径从目标遍历回起点。基本上,你这样做:
int location = LocationOfChosenUser;
System.out.print(LocationOfChosenUser);
while (location != sourceVertex) {
location = lastStep[LocationOfChosenUser];
System.out.print(" <- " + location);
}
System.out.println();
此顺序为您提供相反的顺序(因此为箭头)。您将如何存储数字并将其反转留给您进行练习。<-
添加回答
举报