图基础
# Introduction
图是一种与树有些相像的数据结构,实际上,从数学意义上说,树是图的一种。然而,在计算机程序设计中,图的应用方式与树不同。图(Graph)是一种非线性数据结构,形式化描述为:$ Graph=(V,E) $。其中,$V={Vi | Vi ∈datatype, i=0,1,……,n-1}$ 是图中元素$Vi$(称为顶点 Vertex )的集合,$n=0$时,$V$为空集,记为$φ$。$E$是顶点之间的关系集,$E(Vi,Vj)$为顶点$Vi$与$Vj$之间是否存在路径的判定条件,即若$Vi$与$Vj$之间的路径存在,则关系$P< Vi,Vj >∈E$。
$$ E = {<V_i,V_j> | (V_i,V_j) \in V 且 P(V_i,V_j), 0 \leq i,j \leq n - 1} $$
在一张图中,树的边数为顶点数减一,而度数为边数的两倍。
Terminology
一个典型的图如下所示:
(4)有向图与无向图
无向图中的边是没有方向的,可以从任意一边到另一边,所以,可以从顶点 A 到顶点 B,也可以从顶点 B 到顶点 A,两者是等价的。然而,有时候图还可以用来模拟另一种情况,即只能沿着边朝一个方向移动——只能从 A 到 B,而不能从 B 到 A,就像单行道一样,这样的图被称作是有向。允许移动的方向在图中通常用边一端箭头表示。 在某些图中,边被赋予一个权值,权值是一个数字,它能代表两个顶点间的物理距离,或者从一个顶点到另一个顶点的时间,或者是两点间的花费(譬如飞机航线)。
图的表示
顶点与边
在抽象的图中,只是简单地把顶点编号,从$0$到$N-1$($N$是顶点数),不需要任何变量类型存储顶点,因为它们的用处来自于它们之间的相互关系。然而在大多数情况下,顶点表示某个真实世界的对象,这个对象必须用数据项描述。譬如,如果在一个飞机航线模拟的图中,顶点代表城市,那么它需要存储城市名字、海拔高度、地理位置和其他信息,基本的如下所示:
邻接矩阵
邻接表
搜索
广度优先搜索:广度优先搜索是按照树的层次进行的搜索,如果此层没有搜索完成的情况下不会进行下一层的搜索。
深度优先搜索:深度优先搜索是按照树的深度进行搜索的,所以又叫纵向搜索,在每一层只扩展一个节点,直到为树的规定深度或叶子节点为止。这个便称为深度优先搜索。