Floyd算法

Floyd算法

简介

1.概念

\(Floyd\) 算法 是解决任意两点间的最短路径的一种算法 是一种插点算法 可以正确处理有向图或带负权非回路的最短路径算法 同时也被用于计算有向图的传递闭包 \(Floyd\) 时间复杂度为 \((N^3)\) 空间复杂度为 \(O(N^2)\)

2.算法证明

IMAGE
可以看出,\(Floyd\) 算法本质是个区间 \(DP\) 问题
状态表示 : \(f[k][i][j]\) 表示 所有从 \(i\) 出发 最终走到 \(j\) 且只经过节点编号
不超过
\(k\) 的所有路径的最小值
阶段划分 : 节点编号 \(k\) 的不同
转移方程 : \(f[k][i][j] = min(f[k][i][j], f[k - 1][i][k] + f[k - 1][k][j])\)
通过 \(DP\) 背包思想 我们约掉了第一维 进而表示 \(Floyd\)

3.算法模板

void floyd()
{
    for(int k = 1; k <= n; k ++)//可以理解为中转点 
        for(int i = 1; i <= n; i ++)//起点
            for(int j = 1; j <= n; j ++)//终点
                g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
}

4.应用

IMAGE




例题

1.最短路问题

Floyd求最短路

2.传递闭包问题

传递闭包问题详解

3.找最小环问题

Floyd最小环问题

4.恰好经过\(k\)条边的最短路问题

类Floyd拓展问题

posted @ 2022-05-12 17:32  光風霽月  阅读(43)  评论(0编辑  收藏  举报