图的表示
图有多种表示方法,比较常用的表示法有邻接链表和邻接矩阵。
根据边的方向,图可以分为无向图和有向图;根据边的权重,图可以分为带权图和不带权图。
对于图 G = ( V , E ) G=(V,E) G=(V,E),其邻接链表表示由一个包含 ∣ V ∣ |V| ∣V∣条链表的数组 A d j Adj Adj所构成,每个结点有一条链表。对于每个结点 u ∈ V u \in V u∈V,邻接链表 A d j [ u ] Adj[u] Adj[u]包含所有与结点 u u u之间有边相连的结点 v v v,即 A d j [ u ] Adj[u] Adj[u]包含图 G G G中所有与 u u u邻接的结点(也可以说,该链表里包含指向这些结点的指针)。由于邻接链表代表的是图的边,在伪代码里,我们将数组 A d j Adj Adj看做是图的一个属性,就如我们将边集合 E E E看做是图的属性一样。因此,在伪代码里,我们将看到 G . A d j [ u ] G.Adj[u] G.Adj[u]这样的表示。
对于邻接链表稍加修改,即可以用来表示权重图(带权图)。权重图是图中的每条边都带有一个相关的权重的图。该权重值通常有一个 w : E → R w:E\rightarrow R w:E→R的权重函数给出。例如,设 G = ( V , E ) G=(V,E) G=(V,E)为一个权重图,其权重函数为 w w w,我们可以直接将边 ( u , v ) ∈ E (u,v)\in{E} (u,v)∈E的权重值 w ( u , v ) w(u,v) w(u,v)存放在结点 u u u的邻接链表里。
对于邻接矩阵表示来说,我们通常会将图 G G G中的结点编为 1 , 2 , . . . , ∣ V ∣ 1,2,...,|V| 1,2,...,∣V∣,这种编号是任意的。在进行此种编号之后,图 G G G的邻接矩阵表示由一个 ∣ V ∣ × ∣ V ∣ |V|×|V| ∣V∣×∣V∣的矩阵 A = ( a i j ) A=(a_{ij}) A=