当前位置:首页 > 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 表单和服务器端脚本。以下是详细步骤: 创建 HTML 表单 使用 enctype="multipart/form-data"…

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('loc…

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 // 创建…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Conte…