最短路径Floyed算法

Posted kasenbob

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径Floyed算法相关的知识,希望对你有一定的参考价值。

使用有向图的邻接矩阵的概念,代码如下:

struct Graph
{
    int vertex[vertexnum];/*?¨μ?±í*/
    int edges[vertexnum][vertexnum];/*áú?ó???ó*/
    int n,e/*í??Dμ??¥μ?êyoí±?êy*/ 
}g;

void Floyd()
{
    int A[mxav][mxav];
    int path[maxv][maxv];
    int n=g.n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            A[i][j]=g.edges[i][j];
            path[i][j]=-1;
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            for(int k=0;k<n;k++)
            {
                if(A[j][k]>A[j][i]+A[i][k])
                {
                    A[j][k]=A[j][i]+A[i][k];
                    path[j][k]=i;
                }
            }
        }
    }
}

这是只过一个中继点的情况(应该是吧。。。),对其进行优化后发现可以进行动态规划,代码如下:

#include<bitsstdc++.h>
using namespace std;
const int maxn=100;

int main()
{
    int n,m;
    int t1,t2,t3;
    int e[maxn][maxn];
    int inf=0x3fffffff;
    scanf("%d %d",&n,&m);
    /*3?ê??ˉ*/
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i==j)
            {
                e[i][j]=0;
            }
            else
            {
                e[i][j]=inf;
            }
        }
    }
    /*?áè?±?*/
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d",&t1,&t2,&t3);
        e[t1][t2]=t3;
    }
    /*o?D???·¨ó???*/
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(e[i][k]<inf&&e[k][j]<inf&&e[i][j]>e[i][k]+e[k][j])
                {
                    e[i][j]=e[i][k]+e[k][j];
                }
            }
        }
    }
    //ê?3?×???μ??á1?
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            printf("%10d",e[i][j]);
        }
        printf("
");    
    } 
    return 0;
}

抽象理解就是先算u,v只经过第1个点的最短路径,然后在此基础上再算过第1,2个点的最短路径,动态方程为a[i][j]=min(a[i][j],a[i][k]+a[k][j]),之后矩阵中存的即为第i个点到第j个点的最短路径;

以上是关于最短路径Floyed算法的主要内容,如果未能解决你的问题,请参考以下文章

图论 最短路径算法 1.Floyed-Warshall算法

数据结构与算法图最短路径算法 ( Floyed 算法 | 图最短路径算法使用场景 | 求解图中任意两个点之间的最短路径 | 邻接矩阵存储图数据 | 弗洛伊德算法总结 )

图论最短路径Floyed算法和Dijkstra算法

算法实验--主函数只有五行的Floyed的算法以及最短路径输出

MATLAB最短路径Floyd算法

Floyed算法