当前位置:首页 > PHP

php实现图

2026-02-14 08:40:25PHP

PHP 实现图数据结构

在 PHP 中实现图数据结构可以通过多种方式完成。图通常由顶点(节点)和边(边)组成,可以使用邻接表或邻接矩阵来表示。

邻接表实现

邻接表是一种常见的图表示方法,适用于稀疏图。每个顶点维护一个列表,存储与之相连的其他顶点。

php实现图

class Graph {
    private $adjacencyList = [];

    public function addVertex($vertex) {
        if (!isset($this->adjacencyList[$vertex])) {
            $this->adjacencyList[$vertex] = [];
        }
    }

    public function addEdge($vertex1, $vertex2) {
        $this->adjacencyList[$vertex1][] = $vertex2;
        $this->adjacencyList[$vertex2][] = $vertex1; // 无向图需要双向添加
    }

    public function getVertices() {
        return array_keys($this->adjacencyList);
    }

    public function getNeighbors($vertex) {
        return $this->adjacencyList[$vertex] ?? [];
    }
}

邻接矩阵实现

邻接矩阵适用于稠密图,使用二维数组表示顶点之间的连接关系。

class Graph {
    private $vertices = [];
    private $adjacencyMatrix = [];

    public function addVertex($vertex) {
        if (!in_array($vertex, $this->vertices)) {
            $this->vertices[] = $vertex;
            $size = count($this->vertices);
            foreach ($this->adjacencyMatrix as &$row) {
                $row[] = 0;
            }
            $this->adjacencyMatrix[] = array_fill(0, $size, 0);
        }
    }

    public function addEdge($vertex1, $vertex2) {
        $index1 = array_search($vertex1, $this->vertices);
        $index2 = array_search($vertex2, $this->vertices);
        if ($index1 !== false && $index2 !== false) {
            $this->adjacencyMatrix[$index1][$index2] = 1;
            $this->adjacencyMatrix[$index2][$index1] = 1; // 无向图需要对称设置
        }
    }
}

图的遍历算法

实现图的深度优先搜索(DFS)和广度优先搜索(BFS)是常见的需求。

php实现图

// DFS 实现
public function dfs($start, &$visited = []) {
    $visited[$start] = true;
    echo $start . " ";
    foreach ($this->getNeighbors($start) as $neighbor) {
        if (!isset($visited[$neighbor])) {
            $this->dfs($neighbor, $visited);
        }
    }
}

// BFS 实现
public function bfs($start) {
    $visited = [];
    $queue = new SplQueue();
    $queue->enqueue($start);
    $visited[$start] = true;
    while (!$queue->isEmpty()) {
        $vertex = $queue->dequeue();
        echo $vertex . " ";
        foreach ($this->getNeighbors($vertex) as $neighbor) {
            if (!isset($visited[$neighbor])) {
                $visited[$neighbor] = true;
                $queue->enqueue($neighbor);
            }
        }
    }
}

加权图的实现

对于加权图,可以在邻接表中存储边的权重信息。

class WeightedGraph {
    private $adjacencyList = [];

    public function addVertex($vertex) {
        if (!isset($this->adjacencyList[$vertex])) {
            $this->adjacencyList[$vertex] = [];
        }
    }

    public function addEdge($vertex1, $vertex2, $weight) {
        $this->adjacencyList[$vertex1][$vertex2] = $weight;
        $this->adjacencyList[$vertex2][$vertex1] = $weight; // 无向图需要双向添加
    }
}

最短路径算法

Dijkstra 算法可以用于寻找加权图中的最短路径。

public function dijkstra($start) {
    $distances = [];
    $previous = [];
    $queue = new SplPriorityQueue();

    foreach ($this->adjacencyList as $vertex => $edges) {
        $distances[$vertex] = INF;
        $previous[$vertex] = null;
    }
    $distances[$start] = 0;

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

    while (!$queue->isEmpty()) {
        $current = $queue->extract();
        foreach ($this->adjacencyList[$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];
}

以上代码展示了在 PHP 中实现图数据结构的基本方法,包括邻接表、邻接矩阵、图的遍历以及最短路径算法。根据具体需求选择合适的实现方式。

标签: php
分享给朋友:

相关文章

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Session 是…

php实现下载

php实现下载

PHP实现文件下载 使用PHP实现文件下载可以通过设置HTTP头部信息强制浏览器下载文件而非直接打开。以下是几种常见的方法: 方法一:直接输出文件内容 $file_path = 'path/to/…

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO queu…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…

php实现过程

php实现过程

PHP 实现过程 PHP 是一种广泛使用的服务器端脚本语言,特别适合 Web 开发。以下是 PHP 实现过程的关键步骤和注意事项。 安装与配置 下载并安装 PHP,可以从官方 PHP 网站获取最新版…

php 实现https

php 实现https

在 PHP 中实现 HTTPS 确保 PHP 应用通过 HTTPS 协议安全传输数据,可以通过以下几种方式实现: 配置服务器强制 HTTPS 在 Web 服务器(如 Apache 或 Nginx)中…