最短路徑問題 dj和floyd演算法

2021-09-24 23:15:08 字數 2142 閱讀 9973

1. 首先是dj演算法,dj演算法的思想是從開始結點開始,每次找到距離開始結點距離最近的結點newp,加入到集合k中,表示已經訪問過,然後遍歷newp的直接相鄰的結點,如果從newp結點開始到直接相鄰的結點 i 的距離dis[newp]+c < dis[i],那麼就更新dis[i],掃瞄完成所有newp的鄰接結點,然後遍歷所有的結點,找到未訪問過的並且dis[i]最小的結點 j ,設為新的 newp ,重複上述步驟,直到所有的結點都完成了訪問。

設定乙個dis[i]矩陣,表示從1到該結點的距離,dis[1] = 0, 開始時其它結點的dis[1] = -1.從1開始進行迴圈。

如果要列印最短路徑,可以設定乙個vectorpre[n], 每個結點 i ,將在更新dis[i]時,更新 pre[i].push_back(newp), 通過newp到達 i 是當前從1到達i 的最短路徑的上乙個結點,這樣從後向前列印即可。

看下面的這個例子:

從1出發,找到最短的鄰接點 3,訪問;從 3 開始遍歷 3 的鄰接點, 更新5的dis[5] = 7, 從未訪問的結點2,4,5中找到最近的結點2,訪問,然後是4訪問,遍歷4的鄰接點,dis[5]更新為6,最後訪問5;完成;

問題是:給出n個地點,m個直接路徑,直接路徑包括兩端地點和它們直接長度,找出1到n號地點的最短路徑:

**為:

#include#include#include#includeusing namespace std;

#define n 101

struct e;

vectoredge[n];//edge[i]中的與元素是乙個個的e型別,包含了直接相連號和邊權

bool mark[n];//表示該結點是否已經加入到最短路徑已知集合中

int dis[n];//從開始結點到任意結點的最短路徑長度度

int main()

for(int i = 1; i <= n; i++)

dis[1] = 0;

mark[1] = true;

int newp = 1;//表示是上乙個加入到最短路徑的點

for(int i = 1; i < n; i++)//迴圈n-1次,將所有的點都加入到集合中

int min = 100000000;

for(int k = 1; k <= n; k++)

}mark[newp] = true;

}printf("%d\n", dis[n]);

}return 0;

}

執行結果,最後乙個例子是上面的圖:

2. floyd演算法求最短路徑,這種演算法要求事先得到所有直接相鏈結點間的距離,然後依次判斷i,j之間是否存在乙個中間結點,使得

ans[i][j] > ans[i][k] + ans[k][j]從而得到新的ans[i][j]的值,要對這個中間結點進行所有結點的遍歷,不可達的要跳過,對所有ans[i][j]進行遍歷n次,就可以得到所有結點間的最短距離,包括i, j之間包含多個中間結點的情況,不用深入研究,記住即可。注意設定ans[i][i] = 0,所以 ans[i][j] == ans[i][i] + ans[i][j],不會進行更新。

**為:

#include#includeusing namespace std;

int ans[101][101]; //初始值為鄰接矩陣,只有直接相鄰的結點的距離才有意義,否則為-1

int main()

ans[i][i] = 0; //自己到自己的路徑長度設為0

}while(m--)

for(int k = 1; k <= n; k++)

for(int i = 1; i <= n; i++)

for(int j = 1; j <= n; j++)

printf("%d\n", ans[1][n]);

}return 0;

}

執行結果為:

最短路徑(Dijsktra演算法 Floyd演算法)

1 最短路徑 兩個結點之間,帶權路徑長度最短的路徑。常用演算法是dijkstra演算法和floyd演算法,區別在於dijsktra演算法每次只能算出某乙個結點到其他結點的最短路徑,而floyd演算法可以直接把圖中任意兩個結點的最短路徑都算出來。最短路徑一定是簡單路徑。2 dijkstra 迪傑斯特拉...

最短路徑 Floyd

簡介 floyd演算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的演算法,與dijkstra演算法類似。該演算法名稱以創始人之一 1978年圖靈獎獲得者 史丹福大學電腦科學系教授羅伯特 弗洛伊德命名。樣例求解 示例 include include using name...

275 最短路徑問題 Floyd

平面上有n個點,每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的任務是找出從一點到另一點之間的最短路徑。輸入檔案共n m 3行,其中 第一行為整數n。第2行到第n 1行 共n行 每行兩個...