一.bellman-ford算法(基于离散数学)
时间复杂度:o(nm)
算法核心:
遍历图中所有边,对每个a(a点)到b(b点)权重为w的边,如果d[b](两点之间的长度)>d[a]+w,就将d[b]=d[a]+w。
可以 用来解决有福权边的图,但在求解负权回路的时候,通常spfa算法更好一些,因为spfa算法的时间复杂度低,但spfa的算法稳定性差些。
核心代码:
int n, m; // n表示点数,m表示边数
int dist[N]; // dist[x]存储1到x的最短路距离
struct Edge // 边,a表示出点,b表示入点,w表示边的权重
{
int a, b, w;
}edges[M];
// 求1到n的最短路距离,如果无法从1走到n,则返回-1。
int bellman_ford()
{
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;
// 如果第n次迭代仍然会松弛三角不等式,就说明存在一条长度是n+1的最短路径,由抽屉原理,路径中至少存在两个相同的点,说明图中存在负权回路。
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < m; j ++ )
{
int a = edges[