Dijkstra单源点最短路径算法

学习参考:

Dijkstra算法(单源最短路径)

最短路径—Dijkstra算法和Floyd算法

使用的图结构:

邻接矩阵:

-1 20 -1 25 80
-1 -1 40 -1 -1
-1 -1 -1 -1 10
-1 -1 20 -1 50
-1 -1 -1 -1 -1

代码:

 1     void Dijkstra(){//单源点最短路径
 2         int i,j;
 3         boolean s[]=new boolean[vexnum];
 4         int dist[]=new int[vexnum];
 5         int prev[]=new int[vexnum];
 6         int v=0;
 7         for(i=0;i<vexnum;i++){
 8             dist[i]=adjMatrix[v][i];
 9             s[i]=false;
10             if(dist[i]>0){
11                 prev[i]=v;
12             }else{
13                 prev[i]=-1;
14             }
15         }
16         dist[v]=0;
17         s[v]=true;
18         for(i=1;i<vexnum;i++){
19             int u=v;
20             int min=0x7FFFFFFF;
21             for(j=0;j<vexnum;j++){//把dist中的最小值加入S
22                 if(s[j]==false && (dist[j]<min) && dist[j]!=-1){//j不在s中 ,j比最小值小
23                     u=j;
24                     min=dist[j];
25                 }
26             }
27             s[u]=true;//结点u加入S中
28             //利用结点u更新dist
29             for(j=0;j<vexnum;j++){
30                 if(s[j]==false && adjMatrix[u][j]!=-1){//j不在s中,并且u->j连通
31                     int newdist=dist[u]+adjMatrix[u][j];//v->u + u->j
32                     if(newdist<dist[j] || dist[j]==-1){
33                         dist[j]=newdist;
34                         prev[j]=u;
35                     }
36                 }
37             }
38         }
39         //-1 0 3 0 2
40         for(i=1;i<vexnum;i++){
41             System.out.print(i);
42             int t=prev[i];
43             while(t!=-1){
44                 System.out.print("<--"+t);
45                 t=prev[t];
46             }
47             System.out.println();
48         }
49     }

 输出:

1<--0
2<--3<--0
3<--0
4<--2<--3<--0

另外一个测试数据:

可视化图结构:

邻接矩阵:

-1 -1 10 -1 30 100
-1 -1 5 -1 -1 -1
-1 -1 -1 50 -1 -1
-1 -1 -1 -1 -1 10
-1 -1 -1 20 -1 60
-1 -1 -1 -1 -1 -1

输出:

1
2<--0
3<--4<--0
4<--0
5<--3<--4<--0

posted @ 2017-10-08 16:44  TQCAI  阅读(233)  评论(0编辑  收藏  举报