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 某省自從實行了很多年的暢通工程計畫後,終於修建了很多路。不過路多了也不好,每次要從乙個城鎮到另乙個城鎮時,都有許多種道路方案可以選擇,而某...