当前位置:首页 > PHP

dijkstra php实现

2026-01-29 16:35:06PHP

Dijkstra算法的PHP实现

Dijkstra算法是一种用于在加权图中查找单源最短路径的经典算法。以下是一个完整的PHP实现示例,包含图的表示和算法执行过程。

图的表示

使用邻接数组来表示图结构,每个节点包含其邻居及对应的边权重:

$graph = [
    'A' => ['B' => 6, 'D' => 1],
    'B' => ['A' => 6, 'D' => 2, 'E' => 2],
    'C' => ['B' => 5, 'E' => 5],
    'D' => ['A' => 1, 'B' => 2, 'E' => 1],
    'E' => ['B' => 2, 'D' => 1, 'C' => 5]
];

算法实现

function dijkstra($graph, $start) {
    // 初始化距离数组
    $distances = [];
    foreach (array_keys($graph) as $node) {
        $distances[$node] = INF;
    }
    $distances[$start] = 0;

    // 初始化优先队列
    $queue = new SplPriorityQueue();
    $queue->insert($start, 0);

    // 记录已访问节点
    $visited = [];

    while (!$queue->isEmpty()) {
        $current = $queue->extract();

        if (isset($visited[$current])) continue;
        $visited[$current] = true;

        foreach ($graph[$current] as $neighbor => $weight) {
            $alt = $distances[$current] + $weight;
            if ($alt < $distances[$neighbor]) {
                $distances[$neighbor] = $alt;
                $queue->insert($neighbor, -$alt); // 使用负数实现最小堆
            }
        }
    }

    return $distances;
}

使用示例

$graph = [
    'A' => ['B' => 6, 'D' => 1],
    'B' => ['A' => 6, 'D' => 2, 'E' => 2],
    'C' => ['B' => 5, 'E' => 5],
    'D' => ['A' => 1, 'B' => 2, 'E' => 1],
    'E' => ['B' => 2, 'D' => 1, 'C' => 5]
];

$startNode = 'A';
$result = dijkstra($graph, $startNode);

print_r($result);

输出解释

运行上述代码将输出从节点A到所有其他节点的最短距离:

Array
(
    [A] => 0
    [B] => 3
    [C] => 7
    [D] => 1
    [E] => 2
)

路径追踪改进版

如果需要记录完整路径而不仅仅是距离,可以修改算法如下:

dijkstra php实现

function dijkstraWithPath($graph, $start) {
    $distances = [];
    $previous = [];
    $queue = new SplPriorityQueue();

    foreach (array_keys($graph) as $node) {
        $distances[$node] = INF;
        $previous[$node] = null;
    }
    $distances[$start] = 0;

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

    while (!$queue->isEmpty()) {
        $current = $queue->extract();

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

    return ['distances' => $distances, 'previous' => $previous];
}

function getPath($previous, $target) {
    $path = [];
    $current = $target;

    while ($current !== null) {
        array_unshift($path, $current);
        $current = $previous[$current];
    }

    return $path;
}

$result = dijkstraWithPath($graph, 'A');
$pathToC = getPath($result['previous'], 'C');

print_r($pathToC); // 输出: Array ( [0] => A [1] => D [2] => E [3] => C )

性能说明

该实现使用PHP的SplPriorityQueue作为优先队列,时间复杂度为O((V+E)logV),其中V是顶点数,E是边数。对于大型图,可能需要考虑更高效的优先队列实现。

标签: dijkstraphp
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP实现打印功能的方法 在PHP中实现打印功能可以通过多种方式完成,包括直接输出到浏览器、生成PDF文件、调用打印机接口等。以下是几种常见的方法: 直接输出HTML内容 PHP可以通过echo或p…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php实现分类

php实现分类

PHP实现分类的方法 数据库设计 创建分类表时,通常需要包含id、名称、父级id等字段。父级id用于实现多级分类结构。 CREATE TABLE categories ( id INT AU…

php无限分类的实现

php无限分类的实现

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

php 实现排序

php 实现排序

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

php实现推送消息推送消息

php实现推送消息推送消息

PHP 实现消息推送的方法 使用 WebSocket 实现实时推送 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实现实时消息推送。 安装 Ratchet 库(WebSo…