图G = (V,E)通常由一组节点V及节点间的边E共同组成。注:节点在图中也称之为顶点。
术语解释
图中每一条边所对应的两个顶点间都指明了方向。下图是一个有向图,图中0到1有一条边,但是1到0没有边。

图中每一条边所对应的两个顶点间都没有方向。下图是一个无向图,图中0到1有一条边,1到0也有一条边。

实现(PHP)
图有邻接表和邻接矩阵两种常用的实现方式。
邻接表
邻接表是一个二维容器,第一维描述某个点,第二维描述这个点所对应的边集们。
可以使用一个二维数组来存储各个顶点和其相邻顶点的信息。一维数组中的每一行的下标是每个顶点的名称或编号,这个下标对应的这一行存储的就是该顶点相邻顶点的信息。
下图是一个有向图,分别有0->1, 0->2 , 0->3 三条边。

下面的数组就可以表示出顶点0相邻的顶点有1,2,3。
1
| $graph = [0 => [1, 2, 3]]
|
完整代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| class Graph {
private $g;
private $n;
private $e;
private $directed;
public function __construct(int $n, bool $directed = false) { assert($n > 0); $this->n = $n; $this->e = 0; $this->directed = $directed; $this->g = array_fill(0, $n, array()); }
public function addEdge(int $v, int $w) { assert($v >= 0 && $v < $this->n); assert($w >= 0 && $w < $this->n); if ($this->hasEdge($v, $w)) return; array_push($this->g[$v], $w); if ($v != $w && !$directed) array_push($this->g[$w], $v); $this->e ++; }
public function hasEdge(int $v, int $w) { assert($v >= 0 && $v < $this->n); assert($w >= 0 && $w < $this->n); if (in_array($w, $this->g[$v])) return true; return false;
}
public function show() { foreach ($this->g as $key => $v) { echo "|{$key}|\t "; foreach ($v as $w) { echo "{$w}\t "; } echo "\n"; } } }
|
评论
shortname
for Disqus. Please set it in_config.yml
.