求最短路径之弗洛伊德(Floyd)算法之php实现

8 篇文章 0 订阅

        求最短路径算法,目前我知道的有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法。相比前一种算法,后一种算法

相对更加简洁优雅,所以先用php实现此种算法。

        既然是有最短路径,肯定是对于由多个顶点组成的图形结构来应用的,且上述算法对无向图、有向图都使用。

        首先是构造描述图形结构的邻接矩阵和描述对应顶点的最小路径的前驱矩阵的二维数组。

        //权值数组
        $pathArray = [
           [0,     1,     5,     65535, 65535, 65535, 65535, 65535, 65535],
           [1,     0,     3,     7,     5,     65535, 65535, 65535, 65535],
           [5,     3,     0,     65535, 1,     7,     65535, 65535, 65535],
           [65535, 7,     65535, 0,     2,     65535, 3,     65535, 65535],
           [65535, 5,     1,     2,     0,     3,     6,     9,     65535],
           [65535, 65535, 7,     65535, 3,     0,     65535, 5,     65535],
           [65535, 65535, 65535, 3,     6,     65535, 0,     2,     7    ],
           [65535, 65535, 65535, 65535, 9,     5,     2,     0,     4    ],
           [65535, 65535, 65535, 65535, 65535, 65535, 7,     4,     0    ],
       ];
       //最短路径数组
       $shortPathArray = [];
       for ($i=0; $i < 9; $i++) { 
           for ($j=0; $j < 9; $j++) { 
               $shortPathArray[$i][$j] = $j;
           }
       }

      数组构造就是上面的代码,如有更好方法,请留言指教,先在此多谢了。。。

      第二步,是对两个矩阵不断进行调整的过程。

      function shortestPath_Floyd(&$pathArray, &$shortPathArray)
      {
        for ($k=0; $k < 9; ++$k) { 
            for ($v=0; $v < 9; ++$v) { 
                for ($w=0; $w < 9; ++$w) { 
                    if ($pathArray[$v][$w] > ($pathArray[$v][$k] + $pathArray[$k][$w])) {
                        $pathArray[$v][$w] = $pathArray[$v][$k] + $pathArray[$k][$w];
                        $shortPathArray[$v][$w] = $shortPathArray[$v][$k];
                    }
                }
            }
        }
      }

     至此,前驱矩阵和邻接矩阵就已经调整完成。邻接矩阵可以清楚的看到各顶点到其他顶点的最小路径权值,前驱矩阵需要一定分析,即可知道一顶点到另一定点最短路径的具体途径过程。

    下面是求各顶点到其他顶点的最短路径的具体途径顶点路线。

       function shortTestPath($pathArray, $shortPathArray)
        {
            for ($v=0; $v < 9; ++$v) { 
                for ($w=$v+1; $w < 9; ++$w) { 
                    echo "V{$v} - V{$w} weight: {$pathArray[$v][$w]}";

                    $k = $shortPathArray[$v][$w];

                    echo " path: {$v}";

                    while ($k != $w) {
                        echo " -> {$k}";
                        $k = $shortPathArray[$k][$w];
                    }

                    echo " -> {$w}\n";
                }

                echo "\n";
             }
        }

      到这里,就讲解结束了,可能具体描述的不太清楚,可以参考大话数据结构这本书的相关示例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从心所愿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值