Floyed-Warshall算法使用动态规划的思想来计算图中所有节点对之间的最短路径,其运行时间复杂度为O(V^3),该算法的约束条件为图中不能包含权值之和为负的环,但可以包含权值为负的边。该算法相对于Dijkstra算法而言较难理解,建议感兴趣的可以阅读《算法导论》这本书中的第25章,里面分析的比较全面。动态规划思想运用范围比较广,对其深刻理解并能灵活运用比较难,所以在学习Floyed-Warshall算法时,为了加深理解,我用C++将其实现。
源代码:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct Info
{
int cost; //当前结点到起始节点的最短路径代价
int pre; //当前结点的前驱节点
Info(){ cost = INT_MAX; pre = -1; }
};
vector<vector<Info>> Path[2]; //存储每个节点对的路径信息,矩阵的行索引表示起始节点,列索引表示终止节点
//其中使用的树的双亲表示法的思想
//由于该算法在迭代过程中不能原地操作,所以此处使用了两个矩阵,迭代过程中不断切换,从而避免了
//每次迭代时进行矩阵复制
int Floyd()
{
int n = Path[0].size();
int flag = 0, flag1;
for (int k = 0; k < n; k++)
{
flag1 = flag;
flag = (flag + 1) % 2;
for (int i = 0; i < n; i++)
{
for (int j