• 图论浅析--最短路之Floyd


    Floyd

    计算每一对顶点间的最短路径。
    需用邻接矩阵存储。
    采用动态规划的原理处理,通过考虑最佳子路径来得到最佳路径。
    算法原理:动态规划。
    时间复杂度:O(n^3)。

    算法思想

    disi,j,k为从i到j的以{1,…,k}集合中的结点为中间节点的最短路径的长度。
    1、若最短路径经过点k,则disi,j,k=disi,k,k1+disk,j,k1
    2、若最短路不经过点k,则disi,j,k=disi,j,k1
    则,disi,j,k=min(disi,j,k1,disi,k,k1+disk,j,k1);
    在实际算法中,为了节约空间,可直接在原来空间上进行迭代,是空间降至二维。

    if(dis[i][j]>dis[i][k]+dis[k][j])
        dis[i][j]=dis[i][k]+dis[k][j];

    Code

    int n;
    int g[NUM][NUM];
    int dis[NUM][NUM];
    int pre[NUM][NUM];
    
    void Floyd()
    {
        memset(dis,INF,sizeof(dis));
        memset(pre,-1,sizeof(pre));
    
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(i==j)
                {
                    dis[i][i]=0;
                    pre[i][i]=0;
                }
                else 
                {
                    dis[i][j]=g[i][j];
                    pre[i][j]=i;
                }
        for(int k=0;k<n;k++)
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    if(dis[i][j]>dis[i][k]+dis[k][j])
                    {
                        dis[i][j]=dis[i][k]+dis[k][j];
                        pre[i][j]=pre[k][j];
                     }
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    排序规则
    revert
    添加字段modify
    修改字段名change
    修改字段注释modify
    修改字段类型modify
    file类型input框赋值
    disabled
    js失去焦点触发
    别把软件开发当做养家糊口的工具...
  • 原文地址:https://www.cnblogs.com/wygdove/p/4814319.html
Copyright © 2020-2023  润新知