Floyd—Warshall算法

来源:互联网 发布:java nio网络编程 编辑:程序博客网 时间:2024/05/01 05:01

算法描述:

适用于多源最短路问题,是一种动态规划算法,状态转移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]},稠密图效果最佳,边权可正可负。时间复杂度:O(n^3);空间复杂度:O(n^2);

代码如下:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>


using namespace std;


const int maxn = 1<<30;
const int maxnm=100+10;


int main()
{
    int r,c;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
        {
            if(i==j) g[i][j]=0;
            else g[i][j]=maxn;
        }
    /*
    开始时一个点到它本身的距离自然是零,到其他点的距离初始化为一个很大的数,这个数需要注意,比较的时候别溢出了;
    */
    for(int i=1;i<=m;++i)
    {
        scanf("%d%d",&u,&v,&w);
        g[u][v]=w;
    }
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            for(int k=1;k<=n;++k)
                if(g[j][k]>g[j][i]+g[i][k]) g[i][k]=g[j][i]+g[i][k];
    /*
    floyd算法的核心,依次选1~n号点尝试进行中转,如果经过这个点i使得两点j,k之间距离减少,则选该点中转,并更新两点之间最短距离,所以最终两个点之间有多少个中转的点并不一定,但两点之间最短距离是一定的;
    */
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=n;++j)
            printf("%d ",g[i][j]);
        printf("\n");
    }
}

0 0
原创粉丝点击