当前位置:首页 > PHP

dijkstra php实现

2026-02-28 13:49:51PHP

Dijkstra 算法的 PHP 实现

Dijkstra 算法用于在加权图中找到从起点到所有其他顶点的最短路径。以下是一个完整的 PHP 实现示例:

class Dijkstra {
    private $graph;
    private $distance;
    private $previous;
    private $unvisited;

    public function __construct($graph) {
        $this->graph = $graph;
    }

    public function shortestPath($start) {
        $this->initialize($start);

        while (!empty($this->unvisited)) {
            $current = $this->getClosestUnvisitedNode();
            foreach ($this->graph[$current] as $neighbor => $cost) {
                if (isset($this->unvisited[$neighbor])) {
                    $newDistance = $this->distance[$current] + $cost;
                    if ($newDistance < $this->distance[$neighbor]) {
                        $this->distance[$neighbor] = $newDistance;
                        $this->previous[$neighbor] = $current;
                    }
                }
            }
            unset($this->unvisited[$current]);
        }

        return $this->formatResults();
    }

    private function initialize($start) {
        $this->distance = [];
        $this->previous = [];
        $this->unvisited = [];

        foreach (array_keys($this->graph) as $vertex) {
            $this->distance[$vertex] = INF;
            $this->previous[$vertex] = null;
            $this->unvisited[$vertex] = true;
        }

        $this->distance[$start] = 0;
    }

    private function getClosestUnvisitedNode() {
        $minDistance = INF;
        $closestNode = null;

        foreach ($this->unvisited as $node => $value) {
            if ($this->distance[$node] < $minDistance) {
                $minDistance = $this->distance[$node];
                $closestNode = $node;
            }
        }

        return $closestNode;
    }

    private function formatResults() {
        return [
            'distance' => $this->distance,
            'previous' => $this->previous
        ];
    }
}

使用示例

// 定义图结构 (邻接表表示)
$graph = [
    'A' => ['B' => 6, 'D' => 1],
    'B' => ['A' => 6, 'D' => 2, 'E' => 2],
    'C' => ['E' => 5],
    'D' => ['A' => 1, 'B' => 2, 'E' => 1],
    'E' => ['B' => 2, 'D' => 1, 'C' => 5]
];

$dijkstra = new Dijkstra($graph);
$result = $dijkstra->shortestPath('A');

print_r($result);

关键点说明

算法实现分为几个主要部分:

  • 初始化所有节点的距离为无穷大(INF),起点距离为0
  • 维护未访问节点集合
  • 每次迭代选择距离起点最近的未访问节点
  • 更新该节点邻居的距离
  • 从未访问集合中移除已处理节点

复杂度分析

基础实现的时间复杂度为O(V^2),其中V是顶点数量。使用优先队列可以优化到O(E + V log V),其中E是边数。

路径重构

要从结果中重构具体路径,可以反向追踪previous数组:

dijkstra php实现

function reconstructPath($previous, $target) {
    $path = [];
    while (isset($previous[$target])) {
        array_unshift($path, $target);
        $target = $previous[$target];
    }
    array_unshift($path, $target);
    return $path;
}

标签: dijkstraphp
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用原生PHP实现分页功能需要结合数据库查询和HTML展示。以下是核心实现步骤: 数据库查询与分页逻辑 // 连接数据库 $conn = new mysqli('loca…

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (int…

php实现购物车

php实现购物车

PHP实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session是…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…

php 实现排序

php 实现排序

PHP 实现数组排序的方法 PHP 提供了多种内置函数和方法来实现数组排序,适用于不同的排序需求。以下是一些常见的排序实现方式: 使用 sort() 函数对数组进行升序排序 sort() 函数对数组…