C++实现一个简单的Floyd算法

Posted Jing Sir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++实现一个简单的Floyd算法相关的知识,希望对你有一定的参考价值。

如下所示,这是一个简单的弗洛伊德:

void Floyd(Graph<EdgeType>&G,EdgeType **Adj,int **Path)
{
    int i,j,v;//i,j为计数器,v记录相应顶点
    int n=G.VerticesNum();
    for(i=0;i<n;i++)//初始化D数组,Path数组
    {
        for(j=0;j<n;j++)
        {
            if(i==j)
            {
                Adj[i][j]=0;
                Path[i][j]=i;
            }
            else
            {
                Adj[i][j]=INFINITY;
                Path[i][j]=-1;
            }
        }
    }
    for(v=0;v<n;v++)
    {
        //检查各条边,将边(u,v)的值作为Adj[v,u],v作为Path[u]的值
        for(Edge<EdgeType> e=G.FirstEdge(v);G.IsEdge(e);e=G.NextEdge(e))
        {
            Adj[v][e.end]=G.Weight(e);
        }
    }
    //如果两个顶点i,j之间的最短路径经过顶点v,且有Adj[i][j]>(Adj[i][v]+Adj[v][j]),则更新Adj[i][j],Path[i][j]
    for(v=0;v<n;v++)
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
    if(Adj[i][j]>(Adj[i][v]+Adj[v][j]))
    {
        Adj[i][j]=Adj[i][v]+Adj[v][j];
        //更新i,j经过的点的编号不超过v的最短路径长度
        Path[i][j]=v;
        //更新i,j之间经过的点的编号不超过v的最短路径上j的前驱
    }
}

 

以上是关于C++实现一个简单的Floyd算法的主要内容,如果未能解决你的问题,请参考以下文章

C++ 实现带权有向图的每对顶点之间的最短路径Floyd算法(完整代码)

Floyd 的最短路径算法 C++

最小环——Floyd变种算法(C++)

Matlab:数模05-图论模型(Floyd算法)

最短路 之 floyd 算法

我的 Floyd-Warshall C++ 实现中的错误