在學習「圖」的時候,遇到過一道經典的題:最短路徑。最短路徑有四種最經典的解法。廢話不多說,直接上**。
//floyd-warshall
#include
using
namespace std;
const
int m=
999999
;int n,m,p1,p2,l;
int map[
1000][
1000];
intmain()
else}}
for(
int i=
1;i<=m;i++
)for
(int k =
1; k <= n; k++)}
}}for(
int i=
1;i<=n;i++
) cout<}return0;
}
弗洛伊德演算法的時間複雜度o(n³),多源、無負權邊,時效性較差。
//dijkstra
#include
using
namespace std;
const
int m=
99999999
;int n,m,p1,p2,l,map[
100]
[100
],dis[
1000
],book[
1000]=
,mi,u;
intmain()
else}}
for(
int i=
1;i<=m;i++
) book[1]
=1;for
(int i=
1;i<=n;i++
)for
(int i=
1;i<=n-
1;i++)}
book[u]=1
;for
(int k=
1;k<=n;k++)}
}}for(
int i=
1;i<=n;i++
)return0;
}
迪傑斯特拉的時間複雜度o(n²),單源、無負權,時效性較好。
//bellman-ford
#include
using
namespace std;
const
int m=
9999999
;int
main()
for(
int i=
1;i<=n;i++
) dis[1]
=0;for
(int i=
1;i<=n-
1;i++)}
}for
(int i=
1;i<=n;i++
)return0;
}
貝爾曼·福特的時間複雜度o(n²),單源、可以判斷是否為負權,時效性較好。
//spfa
#include
using
namespace std;
const
int inf=
9999999
;int
main()
;int tail=
1,head=1;
int k;
for(
int i=
1;i<=n;i++
) dis[1]
=0;for
(int i=
1;i<=n;i++
)for
(int i=
1;i<=n;i++
)int i;
for(i=
1;i<=m;i++
) que[tail]=1
; tail++
; book[i]=1
;while
(headif(book[p2[k]]==
0)} k=next[k]
; head++;}
for(i=
1;i<=n;i++
)return0;
}
四種最短路徑演算法對比
floyd dijkstra bellman ford 佇列優化的bellman ford 空間複雜度 o n o m o m o m 時間複雜度 o n o m n logn o nm o nm 適用情況 稠密圖,和頂點關係密切 稠密圖,和頂點關係密切 稀疏圖,和邊關係密切 稀疏圖,和邊關係密切 ...
最短路徑四種演算法 總結篇
最短路 在乙個圖中有 n個點 m條邊。邊有權值,權值可正可負。邊可能是有向的,也可能是無向的。給定兩個點,起點是s,終點是t,在所有能連線s和t的路徑中尋找邊的權值之 和 最小的路徑,這就是最短路徑問題 最短路有兩種 無權圖bfs求最短路 有權圖演算法 對比 主要適用方向 時間複雜度 處理負權邊 處...
最短路四種演算法模板
1.floyed演算法求多源最短路 includeusing namespace std const int maxn 1e3 10 define inf 0x3f3f3f3f int mp maxn maxn 記錄圖之間的路徑 int main 初始化 for int i 0 i a b c mp...