java 迪杰斯特拉_Java 实现Dikstra迪杰斯特拉算法 关于单源顶点最短路径问题的求解...
Dijkstra算法是按照路徑長度遞增的方法計算某一點(diǎn)到其余各頂點(diǎn)的最短路徑。其算法的基本思想是:把圖中所有頂點(diǎn)分成兩組,第一組包括已確定最短路徑的頂點(diǎn)(初始只包括源點(diǎn)v0),第二組包括尚未確定最短路徑的頂點(diǎn),然后按最段路徑長度遞增的次序逐個把第二組的頂點(diǎn)加到第一組中去,直至從v0可以到大的所有頂點(diǎn)都包括到第一組中。在這個過程中,總保持v0到第一組各頂點(diǎn)的最短路徑都不大于從v0到第二組的任何頂點(diǎn)的最短路徑長度。另外,每一頂點(diǎn)都對應(yīng)一個距離值,第一組的頂點(diǎn)對應(yīng)的距離值就是從v0到此頂點(diǎn)的只包括第一組的頂點(diǎn)為中間頂點(diǎn)的最短距離。
這里使用以下圖進(jìn)行說明:
該圖的鄰接矩陣如下所示:
代碼:package?單源頂點(diǎn)最短路徑Dijkstra;
/**
*?@author?wangyq
*?@Date?2016-09-04?15:57
*/
/*
*?單源頂點(diǎn)最短路徑問題求解:
*?最短路徑問題:給定帶權(quán)有向圖G和源點(diǎn)v0,求從v0到圖中其他各頂點(diǎn)的最短距離.
*?Dijkstra算法:按路徑長度遞增的方法計算某一點(diǎn)到其余各點(diǎn)的最短距離。
*/
public?class?Dijkstra?{
/*
*?max:給出的極大值,表示頂點(diǎn)之間無法到達(dá)
*?dist[]:存儲最短路徑長度的數(shù)組
*?prve[]:存儲當(dāng)前頂點(diǎn)的前驅(qū)頂點(diǎn)
*?a[][]:給定測試的鄰接矩陣表
*/
private?static?int?max=Integer.MAX_VALUE;
private?static?int?dist[]=new?int[6];
private?static?int?prve[]=new?int[6];
private?static?int?a[][]={
{0,max,10,max,30,100},
{max,0,5,max,max,max},
{max,max,0,50,max,max},
{max,max,max,0,max,10},
{max,max,max,20,0,60},
{max,max,max,max,max,0}
};
//dijkstra算法
public?void?dijkstra(int?v,int?[][]a,int?dist[],int?prve[]){
int?n=dist.length-1;
//s[]:存儲已經(jīng)找到最短路徑的頂點(diǎn),false為未求得
boolean[]s=new?boolean[n+1];
for(int?i=1;i<=n;i++){
//初始化dist[]數(shù)組
dist[i]=a[v][i];
s[i]=false;
/*
*?prve[]數(shù)組存儲源點(diǎn)到頂點(diǎn)vi之間的最短路徑上該頂點(diǎn)的前驅(qū)頂點(diǎn),
*?若從源點(diǎn)到頂點(diǎn)vi之間無法到達(dá),則前驅(qū)頂點(diǎn)為-1
*/
if(dist[i]
prve[i]=v;
else
prve[i]=-1;
}
dist[v]=0;??????????//初始化v0源點(diǎn)屬于s集
s[v]=true;??????????//表示v0源點(diǎn)已經(jīng)求得最短路徑
for(int?i=1;i<=n;i++){
int?temp=Integer.MAX_VALUE;?//temp暫存v0源點(diǎn)到vi頂點(diǎn)的最短路徑
int?u=v;
for(int?j=1;j<=n;j++){
if((!s[j])&&dist[j]
u=j;????????????????????????????????????????????//更新當(dāng)前源點(diǎn),當(dāng)前vi作為下一個路徑的源點(diǎn)
temp=dist[j];???????????????????????????//更新當(dāng)前最短路徑
}
}
s[u]=true;??????????????????????????????????????//頂點(diǎn)vi進(jìn)s集
//更新當(dāng)前最短路徑以及路徑長度
for(int?j=0;j<=n;j++){
if((!s[j])&&a[u][j]
int?newDist=dist[u]+a[u][j];????????????????????????????????//累加更新最短路徑
if(newDist
dist[j]=newDist;????????????????????????????????????????????????????//更新后的最短路徑
prve[j]=u;??????????????????????????????????????????????????????????//當(dāng)前頂點(diǎn)加入前驅(qū)頂點(diǎn)集
}
}
}
}
}
//結(jié)果輸出方法
/*
*?m:源點(diǎn)
*?[]p:更新結(jié)果后的前驅(qū)頂點(diǎn)集
*?[]d:更新結(jié)果后的最短路徑集
*/
public?void?outPath(int?m,int?[]p,int?[]d){
for(int?i=0;i
//當(dāng)前頂點(diǎn)已求得最短路徑并且當(dāng)前頂點(diǎn)不等于源點(diǎn)
if(d[i]
System.out.print("v"+i+"
int?next=p[i];??????????????//設(shè)置當(dāng)前頂點(diǎn)的前驅(qū)頂點(diǎn)
while(next!=m){?????//若前驅(qū)頂點(diǎn)不為一個,循環(huán)求得剩余前驅(qū)頂點(diǎn)
System.out.print("v"+next+"
next=p[next];
}
System.out.println("v"+m+":"+d[i]);
}
//當(dāng)前頂點(diǎn)未求得最短路徑的處理方法
else
if(i!=m)
System.out.println("v"+i+"
}
}
public?static?void?main(String[]?args)?{
//?TODO?Auto-generated?method?stub
Dijkstra?D=new?Dijkstra();
D.dijkstra(0,?a,?dist,?prve);
D.outPath(0,?prve,?dist);
}
}
結(jié)果如下:
總結(jié)
以上是生活随笔為你收集整理的java 迪杰斯特拉_Java 实现Dikstra迪杰斯特拉算法 关于单源顶点最短路径问题的求解...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yar java_Yar 的传输协议学习
- 下一篇: java中调用_如何获取Java中的调用