最短路徑演算法

2021-04-13 08:41:45 字數 3348 閱讀 8016

floyd演算法

012345

001∞∞

54 1108∞∞

1 2∞801∞3

3∞∞1035

45∞∞302

5413520

floyd

演算法過程描述如下:

1、首先s以邊集m初始化,得到所有的直接連通代價;

2、依次考慮第

k個結點,對於s中的每乙個s

[i][j]

,判斷是否滿足:

s[i][j]>s[i][k]+s[k][j]

,如果滿足則用

s[i][k]+s[k][j]

代替s[i][j]

,此為第k步;

3、k迴圈取遍所有結點,演算法結束時,s為最終解。

1經典dijkstra演算法的主要思想

演算法介紹

dijkstra演算法是由荷蘭計算機科學家艾茲格·迪科斯徹發現的。演算法解決的是有向圖中最短路徑問題。

舉例來說,如果圖中的頂點表示城市,而邊上的權重表示著城市間開車行經的距離。 dijkstra演算法可以用來找到兩個城市之間的最短路徑。

dijkstra演算法的輸入包含了乙個有權重的有向圖g,以及g中的乙個**頂點s。 我們以v表示g中所有頂點的集合。 每乙個圖中的邊,都是兩個頂點所形成的有序元素對。(u,v)表示從頂點u到v有路徑相連。 我們以e所有邊的集合,而邊的權重則由權重函式w: e → [0, ∞]定義。 因此,w(u,v)就是從頂點u到頂點v的非負花費值(cost)。 邊的花費可以想像成兩個頂點之間的距離。任兩點間路徑的花費值,就是該路徑上所有邊的花費值總和。 已知有v中有頂點s及t,dijkstra演算法可以找到s到t的最低花費路徑(i.e. 最短路徑)。 這個演算法也可以在乙個圖中,找到從乙個頂點s到任何其他頂點的最短路徑。

演算法描述

這個演算法是通過為每個頂點v保留目前為止所找到的從s到v的最短路徑來工作的。初始時,源點s的路徑長度值被賦為0(d[s]=0), 同時把所有其他頂點的路徑長度設為無窮大,即表示我們不知道任何通向這些頂點的路徑(對於v中所有頂點v除s外d[v]= ∞)。當演算法結束時,d[v]中儲存的便是從s到v的最短路徑,或者如果路徑不存在的話是無窮大。 dijstra演算法的基礎操作是邊的拓展:如果存在一條從u到v的邊,那麼從s到u的最短路徑可以通過將邊(u,v)新增到尾部來拓展一條從s到v的路徑。這條路徑的長度是d+w(u,v)。如果這個值比目前已知的d[v]的值要小,我們可以用新值來替代當前d[v]中的值。拓展邊的操作一直執行到所有的d[v]都代表從s到v最短路徑的花費。這個演算法經過組織因而當d達到它最終的值的時候沒條邊(u,v)都只被拓展一次。

演算法維護兩個頂點集s和q。集合s保留了我們已知的所有d[v]的值已經是最短路徑的值頂點,而集合q則保留其他所有頂點。集合s初始狀態為空,而後每一步都有乙個頂點從q移動到s。這個被選擇的頂點是q中擁有最小的d值的頂點。當乙個頂點u從q中轉移到了s中,演算法對每條外接邊(u,v)進行拓展。  

#include "stdio.h"

struct vertex ;

main()

for(i=0;i<6;i++)

dist[i]=a[0][i];

for(i=0;i<6;i++)

for(j=0;j<6;j++)

path[i][j]=-1;

for(i=0;i<6;i++)

s[0].tag=1;

path[0][0]=0;

tag_number=1;

while(tag_number<6)

} min=100;

for(k=0;k<6;k++)

} dist[t]=min;

s[t].tag=1;

printf("the vertex %d has been selected!/n",t);

k=t;

temp=0;

for(i=0;i<6;i++)

if((s[i].tag==1)&&(i!=k)&&(dist[k]==dist[i]+a[i][k]))

path[k][kt]=k; }

tag_number++; }

for(i=0;i<6;i++)

printf("dist[%d]=%d/n",i,dist[i]);

for(i=0;i<6;i++)

for(j=0;j<6;j++)

if(path[i][j]!=-1)

printf("path[%d][%d]=%d ",i,j,path[i][j]);

else

printf("/n");

getch(); }

dist[0]=0

dist[1]=1

dist[2]=3

dist[3]=4

dist[4]=6

dist[5]=2

path[0][0]=0 

path[1][0]=0 path[1][1]=1 

path[2][0]=0 path[2][1]=1 path[2][2]=2 

path[3][0]=0 path[3][1]=1 path[3][2]=2 path[3][3]=3 

path[4][0]=0 path[4][1]=1 path[4][2]=5 path[4][3]=4 

path[5][0]=0 path[5][1]=1 path[5][2]=5

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

最短路徑演算法

個人覺得下面 有代表性 最短路徑演算法原始碼 vb 本人載 開發gis,遊自編的最短路徑查詢程式,速度特快,3萬節點,35000條路全部遍歷,只需1秒。現將最短路徑的思路告訴大家,希望大家在優化,並用不同語言編制,我正在學delphi,準備用delphi做成庫,本例以由拓撲關係的arc info 檔...

最短路徑演算法

一,動態規劃 設起點為st,終點為ed。用dis v 表示v到st的距離。動態規劃方程 dis v min 初值dis st 0。偽 帶open標記,省略了追蹤陣列per dis st 0 open st true for all v st dis v open v false for 1 v 1 ...