最短路徑 Floyd演算法與Dijkstra演算法

2021-09-12 03:39:01 字數 2167 閱讀 3133

floyd演算法,也被叫做插點法,可以解決多源最短路徑的問題,即通過在兩個目標點之間插入第三個點作為中轉點,從而達到縮短目標點之間距離的目的

(利用《啊哈!演算法》一書中的更有助於理解

箭頭標記的數字為兩點之間的距離,我們可以發現通過某個點可以是另外兩個點之間的距離減小,且不影響它們之間的連通性

我們用乙個二維陣列map[i][j]儲存上圖,i,j任意兩點的序號,map[i][j]的值為這兩點間的距離

可得到floyd演算法的核心**(不難理解喲)

for

(int k=

1;k<=n;k++

)for

(int i=

1;i<=n;i++

)for

(int j=

1;j<=n;j++

)

(演算法雖簡單,但時間複雜度為o(n)^3,無時間限制可以使用,否則容易超時)

#include

#include

#define inf 99999999

bool be[

1001

], en[

1001];

int map[

1001][

1001];

int max_flag;

intfloyd()

}return min;

}int

main()

memset

(be, false,

sizeof

(be));

memset

(en, false ,

sizeof

(en));

for(

int j =

1; j <= s;

++j)

for(

int k =

1; k <= d;

++k)

printf

("%d\n"

,floyd()

);}return0;

}

dijkstra演算法(單源最短路徑o(n)^2),用乙個一維陣列儲存起點到目標點的距離,用二維陣列通過中轉點對距離進行更新

該題的dijkstra演算法

#include

#include

using namespace std;

const

int inf =

0x3fffffff

;int map[

1010][

1010];

int dis[

1010];

//dis[i]記錄起點到點i的距離

int book[

1010];

//記錄該點是否與起點連線

int st[

1010

], en[

1010];

int n,flag;

void

dijkstra()

} book[flag]=1

;for

(k =

1; k <= n; k++)}

}int

main()

while

(t--

)int min = inf;

for(

int i =

0; i < s; i++

)for

(int i=

0;i<=n;i++

) dis[i]

=map[0]

[i];

for(

int i=

0;i)scanf

("%d"

,&en[i]);

dijkstra()

;for

(int i=

0;i) min=

min(min,dis[en[i]];

printf

("%d"

,min);}

return0;

}

floyd演算法(最短路徑)

最短路徑 描述 已知乙個城市的交通路線,經常要求從某一點出發到各地方的最短路徑。例如有如下交通圖 則從a出發到各點的最短路徑分別為 b 0c 10 d 50 e 30 f 60 輸入 輸入只有乙個用例,第一行包括若干個字元,分別表示各頂點的名稱,接下來是乙個非負的整數方陣,方陣維數等於頂點數,其中0...

最短路徑Floyd演算法

前面我們介紹了單源最短路徑問題的dijkstra演算法,dijkstra演算法雖然有比較好看的複雜度,但其對於有負權值的圖來講,就顯得力不從心了,下面我們來介紹另一種更為廣泛的最短路徑問題的解法 floyd演算法 floyd演算法 弗洛伊德演算法 的原理基於動態規劃,比如要找出從a到b的經過這k個點...

Floyd最短路徑演算法

1398 工程 time limit 1 sec memory limit 128 mb submit status web board description 某省自從實行了很多年的暢通工程計畫後,終於修建了很多路。不過路多了也不好,每次要從乙個城鎮到另乙個城鎮時,都有許多種道路方案可以選擇,而某...