最短路径算法
1 public class Dijkstra {
2
3 static final int maxWeight = 9999;
4
5 //distance保存了从起始节点到每一个节点的最短距离
6 //path保存了路径
7 //v0是起始节点
8 public static void dijkstra(MyAdjGraphic g,int v0,int[]
distance,int[] path)
9 throws Exception
10 {
11 int n = g.getNumOfVertice();//结点数量
12 int[] s = new int[n]; //标示结点是否已被访问的数组
13 int minDis; //每次找到的最短路径
14 int u=0; //下一次最短路径对应的结点的下标
15
16 //初始化,把初始节点距离所有节点的信息初始化
17 for(int i=0;i<n;i++)
18 {
19 distance[i] = g.getWeightOfEdges(v0, i);
20 s[i] = 0; //未访问
21 if(i!=v0&&distance[i]<maxWeight)
22 {
23 path[i]= v0;
24 }
25 else
26 {
27 path[i]=-1;
28 }
29 }
30 s[0]=1; //标记为已访问
31
32 //下面是一个大循环,找出每个节点距离初始节点的最短距离
33 for(int i=1;i<n;i++)
34 {
35 minDis = maxWeight;
36 //从还未访问过的节点中,选择一个距起始节点最近的点
37 for(int j=0;j<n;j++)
38 {
39 if(distance[j]!=-1) //说明有边存在
40 {
41 //结点未访问,并且小于当前最小路径
42 if(s[j]==0&&distance[j]<minDis)
43 {
44 u = j;
45 minDis = distance[j];
46 }
47 }
48 }
49 //如果节点都访问到了,退出
50 if(minDis==maxWeight)
51 {
52 return ;
53 }
54
55 //把这个未访问的节点设置为访问过了
56 s[u]=1;//标记为已访问
57
58 //然后以这个节点为主,进一步找最小的路径与前面已有的路径比较,取最小的。
59 for(int j=0;j<n;j++)
60 {
61 if(g.getWeightOfEdges(u, j)!=-1) //有边存在
62 {
63 //说明起始节点还未能到达此节点
64 if(distance[j]==-1) //未访问过
65 {
66
if(s[j]==0&&g.getWeightOfEdges(u, j)<maxWeight)
67 {
68 distance[j] =
distance[u]+g.getWeightOfEdges(u, j);
69 //记录找到的节点的前一个节点,记录最小路径
70 path[j]=u;
71 }
72 }
73 //若以前访问过,则比较哪一条路径比较短
74 else
75 {
76
//因为以前起始节点也路过这个,因此要把当前的路径长度和以前的路径长度进行比较
77
if(s[j]==0&&g.getWeightOfEdges(u, j)<maxWeight &&
distance[u]+g.getWeightOfEdges(u, j)<distance[j])
78 {
79 distance[j] =
distance[u]+g.getWeightOfEdges(u, j);
80 //记录找到的节点的前一个节点,记录最小路径
81 path[j]=u;
82 }
83 }
84 }
85 //一个大循环下来,distance里存放的是起始节点到目前能到达且未访问节点的全部距离,
86 然后再用起初的循环找出距离最小的且未访问的点作为主,进而继续寻找
87 }
88
89 }
90
91 }
92 }