迪杰斯特拉算法(PHP实现)

<?php
/**
 *带权有向图dijkstra(迪杰斯特拉)算法
 * 时间复杂度O(n^3)
 * 思路:
 * 1 将图的顶点分成两部分,S(最短路径顶点集),U(除了S集以外的顶点集)
 * 2 v到S中顶点距离小于v到U中任意顶点距离
 * 3 v到U中顶点的最小距离,那么该路径必定过S中顶点
 * 步骤:
 * 1 初始时,S只包含源点,S={v},v的距离为0.U包含除v以外的其他顶点,即U={其余顶点},若v与U中顶点u有边,则<u,v>有权值,不是临接点权值为无穷。
 * 2 从U中选取一个距离v最小的顶点k,加入S中(距离为v到k的最短距离)。
 * 3 以k为中间点,从源点到u点的距离m(经过中间点k),nm(不经过中间点k),如果m<nm,那么需要修改u点的权(经过中间点边的权之和),并将u加入S中。
 * 4 重复2,3步骤直到所有的顶点都包含在S中。
 * 最终要的思想:
 *  通过边来松弛v到其他顶点的路程
 */
class Dijkstra{
    const MAXINT = 32767;
    const MAXNUM = 6;
    private $v;
    public static $dist;
    public function __construct($v)
    {
        $this->v = $v;
        self::$dist = [];
    }

    //该矩阵表示图之间顶点的连接关系及权值
    private static $map = [
        [0,self::MAXINT,10,self::MAXINT,30,100],
        [self::MAXINT,0,5,self::MAXINT,self::MAXINT,self::MAXINT],
        [self::MAXINT,s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值