图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。(摘自百度百科)

 

1.Floyd 弗洛伊德算法

这种算法解决的是多源最短路问题(求任意两点之间的最短路径)

若我们用二维数组e[i][j]表示点i到点j当前的最短距离(程序运行完后数组中存的就是真正的最短距离)

那么我们可以用e[i][j]=max(e[i][j],e[i][k],e[j][k]);来更新e数组。也就是比较 从i到j 和 从i到k+从k到j 的距离

重点来啦!!!

核心思想:能否找到第三点使得任意两点的距离变短,即能否找到 i->k->j 比 i->j 短,如果能找到,就更新。

下面呈上代码:

//多元最短路 Floyd O(n^3)
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=99999999;
int n,m,e[1005][1005];
int main()
{
    int i,j,k,a,b,c;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(i==j) e[i][j];
            else e[i][j]=maxn;
        }
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        e[a][b]=c;
    }
    //Floyd核心部分 
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            for(k=1;k<=n;k++)
                if(e[j][k]>e[j][i]+e[i][k])
                    e[j][k]=e[j][i]+e[i][k];
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
            printf("%d ",e[i][j]);
        printf("\n");
    }
    return 0;
}
Floyd

相关文章: