图表类型

根据绘制或表示方式的不同,有不同类型的图表可供选择。每种类型的图形都有不同的行为和用途。我们将重点介绍四种主要的图形类型。

有向图

如果一个图只包含有向边,那么这个图就被称为有向图。有向图也称为数字图或有向网络。下图表示一个有向图。这里,(A,B)、(B,C)、(C,E)、(E,D)、(E,F)和(D,B)边都是有向边。由于这些边都是有向边,因此边 AB 与边 BA 并不相同:

image 2023 11 08 16 42 34 396

无向图

如果一个图只包含不定向边,那么这个图就是不定向图。换句话说,无向图中的边是双向的。有时,无向图也被称为无向网络。在无向图中,如果顶点 A 与顶点 B 相连,则假定 (A, B) 和 (B, A) 代表同一条边。下图显示了一个无向图的示例,其中所有的边都没有箭头表示方向:

image 2023 11 08 16 43 10 464

加权图

如果一个图的所有边都是加权边,那么这个图就称为加权图。我们将在接下来的章节中详细讨论加权图。加权图可以是有向图,也可以是无向图。每条边都必须有一个与之相关的值。边的权重通常称为边的代价。下图表示一个有五个顶点和七条边的无向加权图。其中,顶点 1 和 2 之间的边的权重为 2,顶点 1 和 4 之间的边的权重为 5,顶点 4 和 5 之间的边的权重为 58:

image 2023 11 08 16 43 45 501

有向无环图 (DAG)

非循环图是指没有循环或环路的图。如果我们想从某个节点访问其他节点,我们不会重复访问任何节点。有向无环图,俗称 DAG,是一种无循环的有向图。有向无环图在图算法中有很多用途。有向无环图具有拓扑排序,即顶点的排序使得每条边的起点端点在排序中都早于终点端点。下图表示一个有向无环图:

image 2023 11 08 16 44 14 141

乍一看,B、C、E 和 D 似乎构成了一个循环,但仔细观察就会发现,它们并没有构成一个循环,而我们在有向图部分使用的示例就是一个完美的循环图示例。

用 PHP 表示图形

由于图是用顶点和边来表示的,因此我们在表示图时必须考虑这两个因素。表示图形的方法有多种,但最常用的有以下几种:

  • 邻接表

  • 邻接矩阵

邻接列表

我们可以使用链表来表示图形,其中一个数组用于表示顶点,每个顶点都有一个链表,用于表示相邻顶点之间的边。用邻接表表示的图形示例如下:

image 2023 11 08 16 47 39 848

邻接矩阵

在邻接矩阵中,我们用一个二维数组来表示图,每个节点在水平和垂直方向上代表数组索引。如果从 A 到 B 的边是有方向性的,那么我们会将该数组索引 [A][B] 设为 1,以标记该连接;否则,它就是 0。 如果该边没有方向性,那么 [A][B] 和 [B][A] 都会设为 1。 如果图是加权图,那么 [A][B] 或 [B][A] 将存储权重而不是 1:

image 2023 11 08 16 48 09 344

这显示了矩阵的有向图表示:

image 2023 11 08 16 48 35 129

虽然我们的图形表示法显示了邻接表和矩阵中数组索引的字母表示法,但我们也可以使用数字索引来表示顶点。