日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java 迪杰斯特拉_Java 实现Dikstra迪杰斯特拉算法 关于单源顶点最短路径问题的求解...

發(fā)布時間:2025/3/20 java 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 迪杰斯特拉_Java 实现Dikstra迪杰斯特拉算法 关于单源顶点最短路径问题的求解... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。