public class Dijkstra {
static int g[][];
static int dist[];//源点到各点的距离
static boolean known[];//各店是否知道最短路径
static int [] prev;//prev:各点最短路径点的前一点
public static void main(String[] args) {
g=new int[5][5];
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
g[i][j]=Integer.MAX_VALUE;
}
}
g[0][1]=10;g[0][3]=30;g[0][4]=100;g[1][2]=50;
g[2][4]=10;g[3][2]=20;g[3][4]=60;
dist=new int[5];
known=new boolean[5];
prev=new int[5];
for(int i=0;i<5;i++)
{
dist[i]=Integer.MAX_VALUE;
}
dijkstra();
for(int i=0;i<5;i++)
{
System.out.print("0->"+i+":");
print(i);
System.out.println();
}
}
public static void print(int v){
if(v!=0)
print(prev[v]);
System.out.print(v+" ");
}
public static void dijkstra(){
int s=0;//s为源点
dist[s]=0;//初始化
for(;;)
{
int v=s;
int min=Integer.MAX_VALUE;
for(int i=0;i<5;i++)
{
if(min>dist[i]&&!known[i])//寻找新的节点v
{ min=dist[i];
v=i;
}
}
if(min==Integer.MAX_VALUE)//如果找不到则退出,也表示遍历结束
break;
known[v]=true;//若找到则将v设为已知
for(int j=0;j<5;j++)//遍历所有v指向的定点v
{
if(!known[j]&&g[v][j]<Integer.MAX_VALUE&&dist[j]>dist[v]+g[v][j])
{
dist[j]=dist[v]+g[v][j];prev[j]=v;
}
}
}
}
}
输出:
0->0:0
0->1:0 1
0->2:0 3 2
0->3:0 3
0->4:0 3 2 4