在Dijkstra算法的基础上作一些改动,可以扩展其功能。比如,可以在求得最短路径的基础上再列出一些次短的路径。做法是先在原图上计算出最短路径,然后从图中删去该路径中的某一条边,在余下的子图中重新计算最短路径。对于原最短路径中的每一条边,均可求得一条删去该边后子图的最短路径,这些路径经排序后即为原图的一系列次短路径。(出处)
还是针对下图实验(视频出处),在计算出A->H的最短路径(60)后,应该可以找出2条次短路径(100和110):
代码贴在下面:import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
final class Constants {
public final static int MAX_V = 1000000000;
}
final class Station {
public Station(final String name) {
this.name = name;
disSum = Constants.MAX_V;
previous = null;
}
public String getName() {
return this.name;
}
public int getDisSum() {
return this.disSum;
}
public void setDisSum(final int disSum) {
this.disSum = disSum;
}
public Station getPrevious() {
return this.previous;
}
public void setPrevious(final Station previous) {
this.previous = previous;
}
@Override
public boolean equals(Object s) {
return name.equals(((Station) s).name);
}
@Override
public String toString() {
return this.getClass().getSimpleName() + "[name=" + name + ", disSum=" + Integer.toString(disSum) + ", previous=" + (previous == null ? "null" : previous.name) + "]";
}
private final String name;
private int disSum;
private Station previous;
}
final class StationDisComparator implements Comparator<Station> {
@Override