public class Main{
public static int dijkstra(int[][] w1,int start,int end) {
boolean[] isLable = new boolean[w1[0].length];//是否标上所有的号
int[] indexs = new int[w1[0].length];//所有标号的下标集合,以标号的先后顺序进行存储。实际上是一个栈
int i_count = -1; //栈的顶点
int[] distance = w1[start].clone();//以v0到各点的最短距离的初始值
int index = start;//从初始点开始
int presentShortest = 0; //当前临时最短距离
indexs[++i_count] = index; //把已经标号的下标存入下标集中
isLable[index] = true;
while(i_count<w1[0].length) {
//第一步:标号v0,即w[0][0]找到距离v0最近的点
int min = Integer.MAX_VALUE;
for(int i=0;i<distance.length;i++) {
if(!isLable[i]&&distance[i]!=-1&&i!=index) {
//如果到这个点有边,并且没有被标号
if(distance[i]<min) {
min = distance[i];
index = i;//把下标改为当前下标
}
}
}
if(index == end) {//已经找到当前点了,就结束程序
break;
}
isLable[index]=true; //对点进行标号
indexs[++i_count] = index; //把已经标号的下标存入下标集中,入栈
if(w1[indexs[i_count-1]][index]==-1||presentShortest+w1[indexs[i_count-1]][index]>distance[index]) {
//如果两个点没有直接相连,或两个点路径大于最短路径
presentShortest = distance[index];
}else {
presentShortest+=w1[indexs[i_count-1]][index];
}
//第二步:将distance中距离加入vi
for(int i=0;i<distance.length;i++) {
//如果vi到那个点有边,则v0到后面点距离增加
if(distance[i]==-1&&w1[index][i]!=-1) {//如果以前不可达,则现在可达了
distance[i]=presentShortest+w1[index][i];
}else if(w1[index][i]!=-1&&presentShortest+w1[index][i]<distance[i]) {
//如果以前可达,但现在的路径比以前更短,则更换成更短路径
distance[i] = presentShortest+w1[index][i];
}
}
}
return distance[end]-distance[start];
}
public static void main(String[] args) {
}
}
无向图的Dijkstra算法(求任意一对顶点间的最短路径)迪杰斯特拉算法
最新推荐文章于 2024-07-02 13:10:43 发布