一、图的定义
(1)顶点
顶点(也称为“节点”)是图的基本部分。它可以有一个名称,我们将称为“键”。
(2)边
边(也称为“弧”)是图的另一个基本部分。边连接两个顶点,以表明它们之间存在关系。
(3)权重
边可以被加权以示出从一个顶点到另一个顶点的成本。例如,在将一个城市连接到另一个城市的道路的图表中,边上的权重可以表示两个城市之间的距离。
利用这些定义,我们可以正式定义图。图可以由 G 表示,其中 G =(V,E)。对于图 G,V 是一组顶点,E 是一组边。每个边是一个元组 (v,w),其中 w,v ∈ V。我们可以添加第三个组件到边元组来表示权重。子图 s 是边 e 和顶点 v 的集合,使得 e⊂E 和 v⊂V 。
下图展示了简单加权有向图的另一示例。正式地,我们可以将该图表示为:
六个顶点的集合:
V={V0,V1,V2,V3,V4,V5};
9 条边的集合:
E={(v0,v1,5),(v1,v2,4),(v2,v3,9),(v3,v4,7),(v4,v0,1),(v0,v5,2),(v5,v4,8),(v3,v5,3),(v5,v2,1)}
二、常见的图结构
图的两种常用的表示方式是邻接矩阵和邻接表。
2.1 邻接矩阵
实现图的最简单的方法之一是使用二维矩阵。在该矩阵实现中,每个行和列表示图中的顶点。存储在行 v 和列 w 的交叉点处的单元中的值表示是否存在从顶点 v 到顶点 w 的边。 当两个顶点通过边连接时,我们说它们是相邻的。 下图展示了图的邻接矩阵。单元格中的值表示从顶点 v 到顶点 w 的边的权重。
邻接矩阵的优点是简单,对于小图,很容易看到哪些节点连接到其他节点。 然而,注意矩阵中的大多数单元格是空的。 因为大多数单元格是空的,我们说这个矩阵是“稀疏的”。矩阵不是一种非常有效的方式来存储稀疏数据。
2.2 邻接表
实现稀疏连接图的更空间高效的方法是使用邻接表。在邻接表实现中,我们保存 Graph 对象中的所有顶点的主列表,然后图中的每个顶点对象维护连接到的其他顶点的列表。 在我们的顶点类的实现中,我们将使用字典而不是列表,其中字典键是顶点,值是权重。
邻接表实现的优点是它允许我们紧凑地表示稀疏图。 邻接表还允许我们容易找到直接连接到特定顶点的所有链接。
三、python 实现图
在我们的 Graph 抽象数据类型的实现中,我们将创建两个类,Graph(保存顶点的主列表)和 Vertex(将表示图中的每个顶点)。每个顶点使用字典来跟踪它连接的顶点和每个边的权重。这个字典称 connectedTo