当前位置:首页 > PHP

dijkstra php实现

2026-02-14 14:35:51PHP

Dijkstra算法PHP实现

Dijkstra算法是一种用于在加权图中查找单源最短路径的经典算法。以下是PHP实现的关键步骤和代码示例:

基础实现思路

创建一个优先队列(最小堆)来存储节点及其当前已知的最短距离。初始化所有节点的距离为无穷大,除了起点设置为0。每次从队列中取出距离最小的节点,更新其邻居节点的距离。

完整代码实现

class Dijkstra {
    public function shortestPath($graph, $start) {
        $distances = [];
        $visited = [];
        $priorityQueue = new SplPriorityQueue();

        foreach ($graph as $vertex => $adj) {
            $distances[$vertex] = INF;
        }
        $distances[$start] = 0;

        $priorityQueue->insert($start, 0);

        while (!$priorityQueue->isEmpty()) {
            $currentVertex = $priorityQueue->extract();

            if (isset($visited[$currentVertex])) {
                continue;
            }
            $visited[$currentVertex] = true;

            foreach ($graph[$currentVertex] as $neighbor => $weight) {
                $alt = $distances[$currentVertex] + $weight;
                if ($alt < $distances[$neighbor]) {
                    $distances[$neighbor] = $alt;
                    $priorityQueue->insert($neighbor, -$alt);
                }
            }
        }

        return $distances;
    }
}

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

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

关键注意事项

PHP的SplPriorityQueue默认是最大堆,因此插入时使用负值来模拟最小堆行为。确保图的表示采用邻接表形式,其中每个节点包含其邻居及对应边的权重。

对于大型图,考虑使用更高效的优先队列实现或优化存储结构。算法时间复杂度为O((V+E)logV),其中V是顶点数,E是边数。

路径追踪扩展

若要记录完整路径而不仅是距离,可添加前驱节点记录:

dijkstra php实现

$previous = [];
// 在更新距离时添加
if ($alt < $distances[$neighbor]) {
    $distances[$neighbor] = $alt;
    $previous[$neighbor] = $currentVertex;
    $priorityQueue->insert($neighbor, -$alt);
}

路径重建函数可通过回溯前驱节点数组生成从起点到任意节点的具体路径。

标签: dijkstraphp
分享给朋友:

相关文章

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

php实现异步

php实现异步

PHP 实现异步的方法 PHP 本身是同步执行的脚本语言,但可以通过以下方法模拟异步操作或实现异步效果: 使用多进程(pcntl_fork) 通过 pcntl_fork 创建子进程实现异步,适用于…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…

php无限分类的实现

php无限分类的实现

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