图论 最短路径floyd

来源:互联网 发布:mac查看wi fi密码 编辑:程序博客网 时间:2024/05/16 14:25

(终于想到了办法去证明floyd算法实现的正确性,见程序后)

floyd算法的目的:求出图中任一节点到任一节点的最短路径。

floyd 算法的基本思想是:s[i][j] = s[i][k] + s[k][j] (s[i][j]表示从节点i到节点j的最短路径),然后通过变换不同的K值,来实现求出节点i到节点j的最短路径。

具体实现如下:   

//size 为图的节点个数void floyd(int size){    int i,j,k;//graph 为图的存储矩阵//s[i][j]为图中从节点i到节点j的最短距离//path[i][j] 为从节点i到节点j的最短路径上,紧挨j节点的上一个节点//可通过path[i][j]打印出各个最短路径所经过的节点    for(i=0;i<size;i++)    {        for(j=0;j<size;j++)        {//初始化s            s[i][j]=graph[i][j];//s[i][j]==INF 表示不能到达,则path[i][j]=-1//否则path[i][j]=i             if (s[i][j]!=INF)            {path[i][j]=i;            }else{path[i][j]=-1;}        }    }    for(k=0;k<size;k++)    {        for(i=0;i<size;i++)        {            for(j=0;j<size;j++)            {                int temp=s[i][k]+s[k][j];//如果同过k可以缩短路径长度,则更新s[i][j]和path[i][j]                if(temp<s[i][j])                {                    s[i][j]=temp;                    path[i][j]=path[k][j];                }            }        }    }}

算法正确性证明:

  1. 直连路径若为最短路径,则在s矩阵初始化后就不会改变。
  2. 当k=0时,程序会计算出从节点i到节点j,最多只经过一个中间节点,即0节点,的全部的最短路径,以后的计算k=1时,以此为基础。(s矩阵的变化以初始值为基础)
  3. 当k=1时,程序会计算出从节点i到节点j,最多只经过两个节点,即0节点和1节,点的全部的最短路径,以后的计算k=2时,以此为基础。(s矩阵的变化以k=1计算出的值为基础)
  4. …………………………
  5. k=size-1时,程序会计算出从节点i到节点j,最多只经过0、1、……、size-1节点,即全部节点,的最短路径。(s矩阵的变化以k=n-1计算出的值为基础)
  6. 证毕。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小白熊电动吸奶器显示F1怎么办 花洒的水变小了怎么办 手机插卡处坏了怎么办 吉利帝豪一键启动钥匙没电怎么办 居民医保断交5年怎么办 社保和医保断了怎么办 停缴了两年社保怎么办 医保交不够20年怎么办 医保断交4个月怎么办 医保断交5个月怎么办 换城市后社保卡怎么办 苹果6s呼叫失败怎么办 苹果手机打电话显示呼叫失败怎么办 苹果手机经常呼叫失败怎么办 苹果手机呼叫号码呼叫失败怎么办 好友把我拉黑了怎么办 有人一直打骚扰电话怎么办 每天都有骚扰电话怎么办 苹果7被电话轰炸怎么办 苹果手机接听声音小怎么办 微信账号封了怎么办 在京东买的手机出现问题怎么办 销售没胆量扫楼怎么办 骨龄比实际年龄小怎么办 身体年龄比实际年龄大怎么办 吃了不熟的鸡蛋怎么办 六角龙尾巴烂了怎么办 兰花长出来的包怎么办 长寿花花开败了怎么办 手机分期0首付怎么办办 办分期手机掉了怎么办 手机办分期被骗了怎么办 办手机分期年龄不够怎么办 信美分期没额度怎么办 家里人不给我钱怎么办 商场租金收不上来怎么办 魅蓝2电池坏了怎么办 格力空调不制冷怎么办 空调外机不好放怎么办 美的空调显示e3怎么办 发现安装空调条码被撕怎么办