Floyd算法 (弗洛伊德)
定义 弗洛伊德最短距离算法(Floyd Shortest Path Algorithm)又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。 原理 我们的目标是寻找从点 i 到点 j 的最短路径。 从任意节点 i 到任意节点 j 的最短路径不外乎2种可能。 ①直接从 i 到 j。 ②从 i 经过若干个节点 k 到 j。 令 Dis(i,j) 为节点 i 到节点 j 的最短路径的距离。 对于每一个节点k,我们检查 Dis(i,k) + Dis(k,j) < Dis(i,j) 是否成立,如果成立,则Dis(i,j) = Dis(i,k) + Dis(k,j)。 所以,当我们遍历完所有节点 k,Dis(i,j)中记录的便是 i 到 j 的最短路径的距离。 ❗弗洛伊德不能处理负权图。 若求 1->3 的最短路,此情况则会陷入1->2->3->1->2->3->1->2->3......死循环。 实现 #include<bits/stdc++.h> using namespace std; const int maxn=1005; const int inf=0x3f3f3f3f; int n,m,e[maxn][maxn]; void floyd(); int main() { int i,u,v,w; fill(e[0],e[0]+maxn*maxn,inf