1. 程式人生 > >Floyd 演算法求多源最短路徑

Floyd 演算法求多源最短路徑

 1 #include <bits/stdc++.h>
 2 
 3 typedef long long LL;
 4 const int MAXN = 100;
 5 const int INF = 0x3f3f3f3f;
 6 using namespace std;
 7 
 8 int pre[MAXN + 3][MAXN + 3], dist[MAXN + 3][MAXN + 3]; //pre 儲存路徑; dist 儲存最短距離
 9 void floyd(int n, int gra[][MAXN + 3]) {
10     for(int i = 1; i <= n; i++) for
(int j = 1; j <= n; j++) dist[i][j] = gra[i][j], pre[i][j] = j; //初始化 11 for(int k = 1; k <= n; k++) { //嘗試經過 k 個點對每對頂點之間的距離進行更新 12 for(int i = 1; i <= n; i++) { 13 for(int j = 1; j <= n; j++) { 14 if(dist[i][k] != INF && dist[k][j] != INF && dist[i][k] + dist[k][j] < dist[i][j]) {
15 dist[i][j] = dist[i][k] + dist[k][j]; 16 pre[i][j] = pre[i][k]; 17 } 18 } 19 } 20 } 21 } 22 23 int pfpath(int u, int v) { //列印最短路徑 24 while(u != v) { 25 cout << u << " "; 26 u = pre[u][v];
27 } 28 cout << u << endl; 29 } 30 31 int gra[MAXN + 3][MAXN + 3]; 32 int main() { 33 int n, m; 34 while(cin >> n >> m){ // n 個點, m 條邊 35 for(int i = 0; i <= n; i++) for(int j = -1; j <= n; j++){ 36 gra[i][j] = (i == j ? 0 : INF); 37 } 38 for(int i = 0; i < m; i++) { 39 int u, v, w; cin >> u >> v >> w; 40 gra[u][v] = gra[v][u] = w; //無向圖 41 } 42 floyd(n, gra); 43 } 44 return 0; 45 }

相關推薦

Floyd 演算法路徑

1 #include <bits/stdc++.h> 2 3 typedef long long LL; 4 const int MAXN = 100; 5 const int INF = 0x3f3f3f3f; 6 using namespace std; 7

Dijkstra貪心演算法路徑

 給定一個帶權有向圖G=(V,E),其中每條邊的權是一個非負實數。另外,還給定V中的一個頂點,稱為源。現在要計算從源到其他所有各頂點的最短路徑長度。這裡的長度就是指路上各邊權之和。 Dijkstra演算法是解單源最短路徑的貪心演算法。 public static void dijk

dijkstra演算法路徑長度並輸出路徑 程式碼

程式碼 /* 6 8 0 0 1 1 0 3 4 0 4 4 1 3 2 2 5 1 3 2 2 3 4 3 4 5 3 */ #include<iostream> #include&l

路徑--Floyd演算法

#include<iostream> #include<cstdio> using namespace std; const int INF = 0x3f3f3f3f; int main(void) { int e[10][10] = { 0 }, dis[10], boo

路徑FloydFloyd小環【模板】

Floyd演算法:用來找出每對點之間的最短距離。圖可以是無向圖,也可以是有向圖,邊權可為正,也可以為負,唯一要求是不能有負環。 1.初始化:將Map[][]中的資料複製到Dist[][]中作為每對頂點

路徑基本介紹(1)--Floyd演算法(路徑,五行程式碼)

       我們來想一想,根據我們以往的經驗,如果要讓任意兩點(例如從頂點a點到頂點b)之間的路程變短,只能引入第三個點(頂點k),並通過這個頂點k中轉即a->k->b,才可能縮短原來從頂點a點到頂點b的路程。那麼這個中轉的頂點k是1~n中的哪個點呢?甚至有時候不只通過一個點,而是經過兩個點或

資料結構與算法系列----路徑Floyd-Warshall演算法

任意兩點最短路徑被稱為多源最短路徑,即給定任意兩個點,一個出發點,一個到達點,求這兩個點的之間的最短路徑,就是任意兩點最短路徑問題,多源最短路徑,而Floyd-Warshall演算法最簡單,只有5行程式碼,即可解決這個問題。 上圖中有4個城市8條公路,公路上的數字表示這條

路徑演算法---Floyd-Warshall

暑假,小哼準備去一些城市旅遊。有些城市之間有公路,有些城市之間則沒有,如下圖。為了節省經費以及方便計劃旅程,小哼希望在出發之前知道任意兩個城市之前的最短路程。 上圖中有4個城市8條公路,公路上的數字表示這條公路的長短。請注意這些公路是單向的。我們現在需要求任意兩

路徑演算法Floyd演算法

## 前言 由於本人太菜,這裡不討論Floyd的正確性。 ## 簡介 多源最短路徑,解決的是求從圖中任意兩點之間的最短路徑的問題。 ## 分析 程式碼短小精悍,主要程式碼只有四行,直接放上: ```cpp for(int k=1;kj和i->j作比較嗎,如果i->a->b->j比i->k->j更短呢? 這時

路徑Floyd-Warshall Algorithm

min algo ron 介紹 表示 解決 路徑 計算 最短距離 介紹:   是解決任意兩點間的最短路徑的一種算法,可以正確處理有向圖或負權(但不可存在負權回路)的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。   Floyd-Warshall算法的時間復雜度是O(N3)

弗洛伊德(Floyd演算法圖的路徑

https://blog.csdn.net/jeffleo/article/details/53349825 弗洛伊德基本思想 弗洛伊德演算法作為求最短路徑的經典演算法,其演算法實現相比迪傑斯特拉等演算法是非常優雅的,可讀性和理解都非常好。 基本思想: 弗洛伊德演算法定義了兩個二維

Flody演算法(有權路徑問題)

多源最短路徑問題,即為求每一對頂點之間的最短路徑問題 演算法描述 演算法思想原理: Floyd演算法是一個經典的動態規劃演算法。用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的

Floyd路徑

多源最短路徑 void floyd()  {     for(i = 0; i < n; i++)     {         for(j = 0; j < n; j++)         {             d[i][j] = g[i][j];   //

Dijkstra演算法-用於路徑

Dijkstra演算法 #include <iostream> using namespace std; #define MaxLine 9999 struct Node{ int node; int value;

Bellman-Ford演算法和佇列優化(SPFA)——路徑

來源自我的部落格 #include <stdio.h> #include <limits.h> int main(){ int n, m; scanf("%

路徑弗洛伊德演算法(java)不含具體路徑

  Floyd-Warshall演算法(Floyd-Warshall algorithm)是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題。   import java.util.Arrays; public class Florid

使用鄰接矩陣+Dijkstra演算法求解單路徑問題

Dijkstra演算法是求解有向帶權圖中某一結點到其它結點的最短路徑演算法。這個演算法和Prim演算法求解最小生成樹有點相似,它也是先有一個初始頂點,然後查詢最小帶權路徑。 不同的是,Prim需要更新最小生成樹的結點,不斷將結點更新到VT中,然後更新low_cost[]陣列

演算法之單路徑問題

1.問題描述:給出一個有向圖G,圖中的每一條邊都有一個非負邊權,要求找出從圖的源頂點s到目標頂點t之間的最短路徑。 例圖:從左到右從上到下,序號從0開始依次增大,即頂點個數n=11,A=s,E=t 2.問題分析: (1)分支限界法: 演算法從G的源點s和空佇列

資料結構 圖論中路徑實現 純程式碼

如下有向圖 求出單源起點A到所有其他節點的最短路徑 完整程式碼: #include <stdio.h> #include <memory.h> //圖論的迪傑斯特拉演算法 #define FINITY 200 #define M 20 //單源點頂點到其他

Floyd演算法短路(圖,資料結構)

Floyd演算法思路:計算某點到其餘各點的距離,可先求該點到其中一個點的距離,其他各點類似。假設求i點到j點的距離,跳點為空時,最短距離就是i到j的最短距離,跳點為1時,最短距離為D[i][j] = min{D[i][j],D[i][1]+D[1][j]},跳點為1和2時,最短距離為D[i][j]=min{D