求单源最短路径的迪卡斯特拉算法,同样直接上代码了,注意与FLOYD算法的比较
package oj;
/**
*
* @author pc
*找出从端点0到其他端点的最短路径
*/
public class DIJKSTRA {
public static void dijkstra(int[][] V,int n){
int[] X={0};
int[] Y=new int[n-1];
int[] dist=new int[n];
int[] flag=new int[n];//flag[i]=1表示已经进入X集合,flag[i]=0表示在Y集合中
int min;
int k;
dist[0]=0;
for(int j=1;j<=n-1;j++){
dist[j]=V[0][j];
}
for(int j=0;j<n;j++){
flag[j]=0;
}
flag[0]=1;
for(int t=1;t<=n-1;t++){
min=9999;//每次进入循环都初始化这两个变量
k=0;
for(int i=1;i<=n-1;i++){
if((flag[i]==0)&&(dist[i]<min)){
min=dist[i];
k=i;
}
}
flag[k]=1;//将选中的最短边加入X;
for(int i=1;i<=n-1;i++){
if((flag[i]==0)&&(dist[k]+V[k][i]<=dist[i]))
dist[i]=dist[k]+V[k][i];
}
}
for(int i=0;i<dist.length;i++){
System.out.print(dist[i]+" ");
}
}
public static void main(String args[]){
int m=9999;
int V[][] = {{0,4,1,9},{m,0,m,m},{m,2,0,3},{m,m,m,0}};
dijkstra(V,4);
}
}