7.1图的基本概念
一、图的定义
图(Graph)是一种网状数据结构,其形式化定义如下:
Graph=(V,R)
V={x∣x∈DataObject}
R={VR}
VR={<x,y>∣P(x,y)∧(x,y∈V)}
DataObject为一个集合,该集合中的所有元素具有相同的特性。
V 中的数据元素通常称为顶点(vertex), VR 是两个顶点之间的关系的集合。P(x,y)表示 x 和 y 之间有特定的关联属性 P。
- 若<x,y>∈VR,则<x,y>表示从顶点 x 到顶点 y 的一条弧(arc),并称 x 为 弧尾(tail)或起始点,称 y 为弧头(head)或终端点,此时图中的边是有方向的,称这样的图为有向图。
- 若<x,y>∈VR,必有<y,x>∈VR,即 VR 是对称关系,这时以无序对(x,y) 来代替两个有序对,表示 x 和 y 之间的一条边(Edge),此时的图称为无向图。
所谓的“顶点在图中的位置”是指该顶点在这个人为的随意排列中的位置序 号。同理,也可以对某个顶点的邻接点进行人为的排序,在这个序列中,自然形成了第 1 个和第 k 个邻接点,并称第 k+1 个邻接点是第 k 个邻接点的下一个邻接点,而最后一个邻接点的下一个邻接点为“空”。
下面给出图的抽象数据类型定义:
ADT Graph
数据对象 V: 一个集合,该集合中的所有元素具有相同的特性。
数据关系 R: R={VR} VR={<x,y>∣P(x,y)∧(x,y∈V)}
基本操作:
- (1)CreateGraph(G)
操作前提:已知图 G 不存在
操作结果:创建图 G。 - (2)DestoryGraph(G)
操作前提:已知图 G 存在;
操作结果:销毁图 G。 - (3)LocateVertex(G,v)
操作前提:已知图 G 存在,顶点 v 值合法;
操作结果:若图 G 中存在顶点 v,则返回顶点 v 在图 G 中的位置。若图 G 中没有顶点 v,则函数返回值为“空”。 - (4)GetVertex(G,i)
操作前提:已知图 G 存在;
操作结果:返回图 G 中的第 i 个顶点的值。若 i 大于图 G 中顶点数,则函 数返回值为“空”。 - (5)FirstAdjVertex(G,v)
操作前提:已知图 G 存在,顶点 v 值合法;
操作结果:返回图 G 中顶点 v 的第一个邻接点。若 v 无邻接点或图 G 中无 顶点 v,则函数返回值为“空”。 - (6)NextAdjVertex(G,v,w)
操作前提:已知图 G 存在,w 是图 G 中顶点 v 的某个邻接点。
操作结果:返回顶点 v 的下一个邻接点(紧跟在 w 后面)。若 w 是 v 的最 后一个邻接点,则函数返回值为“空”。 - (7)InsertVertex(G,u)
操作前提:已知图 G 存在,u 值合法;
操作结果:在图 G 中增加一个顶点 u。 - (8)DeleteVertex(G,v)
操作前提:已知图 G 存在,v 值合法;
操作结果:删除图 G 的顶点 v 及与顶点 v 相关联的弧。 - (9)InsertArc(G,v,w)
操作前提:已知图 G 存在,v 值、w 值合法;
操作结果:在图 G 中增加一条从顶点 v 到顶点 w 的弧。 - (10)DeleteArc(G,v,w)
操作前提:已知图 G 存在,v 值、w 值合法,存在弧(v,w) ;
操作结果:删除图 G 中从顶点 v 到顶点 w 的弧。 - (11)TraverseGraph(G)
操作前提:已知图 G 存在;
操作结果:按照某种次序,对图 G 的每个顶点访问一次且仅访问一次。
二、基本术语
(1)完全图、稀疏图与稠密图
设 n 表示图中顶点的个数,用 e 表示图中边或弧的数目,并且不考虑图中每 个顶点到其自身的边或弧。即若<vi,vj>∈VR,则 vi≠vj。
对于无向图而言,其边 数 e 的取值范围是 0~n(n-1)/2。有 n(n-1)/2 条边(图中每个顶点和其余 n-1 个顶点都有边相连)的无向图为无向完全图。
对于有向图而言,其边数 e 的取值 范围是 0~n(n-1)。有 n(n-1)条边(图中每个顶点和其余 n-1 个顶点都有弧相连)的有向图为有向完全图。对于有很少条边的图(e < n log n)称为稀疏图, 反之称为稠密图。
(2)子图
(3)邻接点
对于无向图 G=(V,{E}),如果边(v,v/)∈E,则称顶点 v,v/互为邻接点, 即 v,v/ 相邻接。边(v,v/)依附于顶点 v 和 v/,或者说边(v,v/)与顶点 v 和 v/ 相关联。对于有向图 G=(V,{A})而言,若弧<v,v/>∈A,则称顶点 v 邻接到 顶点 v/,顶点 v/ 邻接自顶点 v,或者说弧<v,v/>与顶点 v,v/相关联。
(4)度、入度和出度
对于无向图而言,顶点 v 的度是指和 v 相关联边的数目,记作 TD(v)。例 如:上面图 G2 中顶点 C 的度是 3,A 的度是 2;在有向图中顶点 v 的度有出度和 入度两部分,其中以顶点 v 为弧头的弧的数目成为该顶点的入度,记作 ID(v), 以顶点 v 为弧尾的弧的数目称为该顶点的出度,记作 OD(v),则顶点 v 的度为 TD(v)= ID(v)+ OD(v)。
例如:上面图 G1 中顶点 A 的入度是 ID(A)=1,出度 OD(A)=2,顶点 A 的度 TD(A)= ID(A)+ OD(A)=3。一般地,若图 G 中有 n 个顶点,e 条边或弧,则图中顶点的度与边的关系如下:
(5)权与网
在实际应用中,图的边或弧上往往与具有一定意义的数有关,即每一条边都 有与它相关的数,称为权,这些权可以表示从一个顶点到另一个顶点的距离或耗费等信息。这种带权的图称为赋权图或网,如下图所示。
(6)路径与回路
无向图 G=(V,{E})中从顶点 v 到 v/的路径是一个顶点序列 vi 0, vi1, vi2,…, vin,其中(vij-1,vij)∈E,1≤j≤n。如果图 G 是有向图,则路径也是有向的, 顶点序列应满足<vij-1,vij>∈A,1≤j≤n。路径的长度是指路径上经过的弧或边 的数目。在一个路径中,若其第一个顶点和最后一个顶点是相同的即 v =v/,则 称该路径为一个回路或环。
若表示路径的顶点序列中的顶点各不相同,则称这样 的路径为简单路径。
除了第一个和最后一个顶点外,其余各顶点均不重复出现的回路为简单回路。如下图(a),( b)所示。
(7)连通图
在无向图 G=(V,{E})中,若从 vi到 vj有路径相通,则称顶点 vi与 vj是连 通的。如果对于图中的任意两个顶点 vi、vj∈V,vi,vj都是连通的,则称该无向 图 G 为连通图。例如:G2 就是连通图。无向图中的极大连通子图称为该无向图的连通分量。在有向图 G=(V,{A})中,若对于每对顶点 vi、vj∈V 且 vi≠vj, 从 vi 到 vj和 vj到 vi都有路径,则称该有向图为强连通图。有向图的极大强连通 子图称做有向图的强连通分量,图 G1 的强连通分量如下图(c)所示。一个连通 图的生成树是一个极小连通子图,它含有图中全部顶点,但只有足以连通 n 个点 的 n-1 条边。