zl程序教程

您现在的位置是:首页 >  后端

当前栏目

基于Java实现的Dijkstra算法示例

JAVA算法 实现 基于 示例 Dijkstra
2023-06-13 09:15:39 时间

本文以实例形式介绍了基于Java实现的Dijkstra算法,相信对于读者研究学习数据结构域算法有一定的帮助。

Dijkstra提出按各顶点与源点v间的路径长度的递增次序,生成到各顶点的最短路径的算法。即先求出长度最短的一条最短路径,再参照它求出长度次短的一条最短路径,依次类推,直到从源点v到其它各顶点的最短路径全部求出为止。
其代码实现如下所示:

packagecom.algorithm.impl;

publicclassDijkstra{
privatestaticintM=10000;//此路不通
publicstaticvoidmain(String[]args){
int[][]weight1={//邻接矩阵
{0,3,2000,7,M},
{3,0,4,2,M},
{M,4,0,5,4},
{7,2,5,0,6},
{M,M,4,6,0}
};

int[][]weight2={
{0,10,M,30,100},
{M,0,50,M,M},
{M,M,0,M,10},
{M,M,20,0,60},
{M,M,M,M,0}
};

intstart=0;
int[]shortPath=dijkstra(weight2,start);

for(inti=0;i<shortPath.length;i++)
System.out.println("从"+start+"出发到"+i+"的最短距离为:"+shortPath[i]);
}

publicstaticint[]dijkstra(int[][]weight,intstart){
//接受一个有向图的权重矩阵,和一个起点编号start(从0编号,顶点存在数组中)
//返回一个int[]数组,表示从start到它的最短路径长度
intn=weight.length;//顶点个数
int[]shortPath=newint[n];//保存start到其他各点的最短路径
String[]path=newString[n];//保存start到其他各点最短路径的字符串表示
for(inti=0;i<n;i++)
path[i]=newString(start+"-->"+i);
int[]visited=newint[n];//标记当前该顶点的最短路径是否已经求出,1表示已求出

//初始化,第一个顶点已经求出
shortPath[start]=0;
visited[start]=1;

for(intcount=1;count<n;count++){//要加入n-1个顶点
intk=-1;//选出一个距离初始顶点start最近的未标记顶点
intdmin=Integer.MAX_VALUE;
for(inti=0;i<n;i++){
if(visited[i]==0&&weight[start][i]<dmin){
dmin=weight[start][i];
k=i;
}
}

//将新选出的顶点标记为已求出最短路径,且到start的最短路径就是dmin
shortPath[k]=dmin;
visited[k]=1;

//以k为中间点,修正从start到未访问各点的距离
for(inti=0;i<n;i++){
if(visited[i]==0&&weight[start][k]+weight[k][i]<weight[start][i]){
weight[start][i]=weight[start][k]+weight[k][i];
path[i]=path[k]+"-->"+i;
}
}
}
for(inti=0;i<n;i++){
System.out.println("从"+start+"出发到"+i+"的最短路径为:"+path[i]);
}
System.out.println("=====================================");
returnshortPath;
}
}

该程序运行结果为:

从0出发到0的最短路径为:0-->0
从0出发到1的最短路径为:0-->1
从0出发到2的最短路径为:0-->3-->2
从0出发到3的最短路径为:0-->3
从0出发到4的最短路径为:0-->3-->2-->4
=====================================
从0出发到0的最短距离为:0
从0出发到1的最短距离为:10
从0出发到2的最短距离为:50
从0出发到3的最短距离为:30
从0出发到4的最短距离为:60