学习参考:
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