当前位置:首页 > 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和MySQL实现基础的搜索功能需要结合表单提交与数据库查询。创建一个HTML表单用于接收用户输入的搜索关键词,通过PHP处理表单数据并查询数据库。 // 搜索表单 (HT…

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

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 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php 实现登录

php 实现登录

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