图论
图的基本概念
图的基本概念
图的定义
现实世界中许多现象能用某种图形表示,这种图形是由一些点和一些连接两点间的连线所组成。
例子:a,b,c,d 4个篮球队进行友谊比赛。为了表示4个队之间比赛的情况,我们作出图7.1.1的图形。在图中4个小圆圈分别表示这4个篮球队,称之为结点。如果两队进行过比赛,则在表示该队的两个结点之间用一条线连接起来,称之为边。这样利用一个图形使各队之间的比赛情况一目了然。
图G的结点与边之间的关系
- 邻接点:同一条边的两个端点。
- 孤立点:没有边与之关联的结点。
- 邻接边:关联同一个结点的两条边。
- 孤立边:不与任何边相邻接的边。
- 自回路(环):关联同一个结点的一条边((v,v)或〈v,v〉)。
- 平行边(多重边):关联同一对结点的多条边。
图G的分类
- 按G的结点个数和边数分为(n,m)图,即n个结点,m条边的图;特别地,(n,0)称为零图,(1,0)图称为平凡图。
- 按G中关联于同一对结点的边数,分为:多重图和简单图;多重图:含有平行边的图。 简单图:不含平行边和自环的图。
- 按G的边有序、无序,分为:有向图、无向图和混合图。
有向图:每条边都是有向边的图称为有向图;
无向图:每条边都是无向边的图称为无向图;
混合图:既有无向边,又有有向边的图称为混合图。 - 按G的边旁有无数量特征,分为:边权图和无权图;
- 按G的任意两个结点间是否有边,分为:完全图Kn 和不完全图。
完全图:任意两个不同的结点都是邻接的简单图称为完全图。n个结点的无向完全图记为Kn。
图的结点的度数及其计算
定义:图中结点 v 所关联的边数(有自回路时计算两次)称为结点v的度数,记为deg(v)。
子图和图的同构
子图
在研究和描述图的性质时,子图的概念占有重要地位。
图的同构
从图的定义可以看出,图的最本质的内容是结点与结点的邻接关系。
例子:考察图7.1.9中的两个图 G=〈V,E〉和 G′=〈V′,E′〉。
显然,定义 g:V→V′,g(vi)=vi ′,可以验证g是满足定义7.1.6的双射,所以G ≌ G′。
对于同构,形象地说,若图的结点可以任意挪动位置,而边是完全弹性的,只要在不拉断的条件下,这个图可以变形为另一个图,那么这两个图是同构的。故同构的两个图从外形上看可能不一样,但它们的拓扑结构是一样的。
路与回路
路与回路
图的连通性
无向图的连通性
定义7.2.3:在无向图,如果一个图的任何两个结点之间都有一条路,那么我们称这个图是连通的,否则是不连通的。
定义7.2.4:图G的一个连通的子图G′(称为连通子图)若不包含在G的任何更大的连通子图中,它就被称作G的连通分支。我们把图G的连通分支数记作W(G)。
有向图的连通性
定义7.2.5:在有向图中,如果若从结点 u 到 v 有一条路,则称 u 可达 v 。
定义7.2.6:设有有向图G,
- 若G的任意两个结点中,至少从一个结点可达另一个结点,则称图G是单向连通的;
- 如果G的任意两个结点都是相互可达的,则称图G是强连通的;
- 如果略去边的方向后,G成为连通的无向图,则称图G是弱连通的。
从定义可知:若图G是单向连通的,则必是弱连通的;若图G是强连通的,则必是单向连通的,且也是弱连通的。但反之,不真。
在图7.2.4中,(a)是强连通的,(b)是单向连通的,©是弱连通的。
图的矩阵表示
邻接矩阵
可达性矩阵
定理7.3.2:有向图G是强连通的当且仅当其可达性矩阵 P 除主对角线外,其它元素均为1。
欧拉图与汉密尔顿图
欧拉图
历史上的哥尼斯堡七桥问题是著名的图论问题。
问题是这样的:18世纪的东普鲁士有个哥尼斯堡城,在横贯全城的普雷格尔河两岸和两个岛之间架设了7座桥,它们把河的两岸和两个岛连接起来(如图7.4.1)。
每逢假日,城中居民进行环城游玩,人们对此提出了一个“遍游”问题,即能否有这样一种走法,使得从某地出发通过且只通过每座桥一次后又回到原地呢?
我们将图7.4.1中的哥尼斯堡城的4块陆地部分分别标以 A,B,C,D,将陆地设想为图的结点,而把桥画成相应的连接边,这样图7.4.1可简化成图7.4.2。于是七桥“遍游”问题等价于在图7.4.2中,从某一结点出发找到一条回路,通过它的每条边一次且仅一次,并回到原来的结点。
定义7.5.1:给定无孤立结点的图G,若存在一条经过G中每边一次且仅一次的回路,则该回路为欧拉回路。具有欧拉回路的图称为欧拉图。
例如,给出如图7.4.3所示的两个图,容易看出,(a)是欧拉图,而(b)不是欧拉图。
定理7.5.1:连通图G是欧拉图的充要条件是G的所有结点的度数都是偶数。
证明:
必要性:设G是一欧拉图,α 是G中的一条欧拉回路。当 α 通过G的任一结点时,必通过关联于该点的两条边。又因为G中的每条边仅出现一次,所以 α 所通过的每个结点的度数必定是偶数。
充分性:我们可以这样来作一个闭迹 β,假设它从某结点A开始,沿着一条边到另一结点,接着再从这个结点,沿没有走过的边前进,如此继续下去。因为我们总是沿着先前没有走过的新边走,又由于图G的边数有限,所以这个过程一定会停止。但是,因为每一个结点都与偶数条边关联,而当沿 β 前进到达结点v时,若 v ≠ A,β 走过了与 v 关联的奇数条边,这样在v上总还有一条没有走过的边。因此,β 必定返回停止在A(见图 7.4.4)。
运用上面的讨论,我们在G1中得到一个从B点出发的一条闭迹 β1。这样我们就得到了一条更大的闭迹,它是从A点出发沿 β 前进到达B,然后沿闭迹 β1 回到B,最后再沿 β 由B走到A。如果我们仍然没有走遍整个图,那么我们再次把闭迹扩大,以此类推,直到最后得到一个欧拉回路。
由于在七桥问题的图 7.4.2中,有4个点是奇数度结点,故不存在欧拉回路,七桥问题无解。
我国民间很早就流传一种“一笔画”游戏。由定理 7.5.1和定理 7.5.2知,有两种情况可以一笔画。
1)如果图中所有结点是偶数度结点,则可以任选一点作为始点一笔画完;
2)如果图中只有两个奇度结点,则可以选择其中一个奇度结点作为始点也可一笔画完。
汉密尔顿图
与欧拉回路类似的是汉密尔顿回路问题。它是1859年汉密尔顿首先提出的一个关于12面体的数学游戏:能否在图 7.4.9中找到一个回路,使它含有图中所有结点一次且仅一次?若把每个结点看成一座城市,连接两个结点的边看成是交通线,那么这个问题就变成能否找到一条旅行路线,使得沿着该旅行路线经过每座城市恰好一次,再回到原来的出发地呢?为此,这个问题也被称作周游世界问题。
树与生成树
无向树
树是图论中的一个重要概念。早在1847年克希霍夫就用树的理论来研究电网络,1857年凯莱在计算有机化学中C2H2n+2的同分异构物数目时也用到了树的理论。而树在计算机科学中应用更为广泛。本节介绍树的基本知识,其中谈到的图都假定是简单图。
定义7.5.1:一个连通无环无向图称为无向树(简称为树)。记作T。树中度数为1的结点称为树叶(或终端结点),度数大于1的结点称为分枝点(或内点,或非终端结点)。一个无圈图称为森林。
显然若图G是森林,则G的每个连通分支是树。如图 7.5.1 (a) 所示的是一棵树;(b)所示的是森林。
定理7.5.1:任一树T中,至少有两片树叶(n≥2时)。
定理7.5.2:一个无向图(n,m)图T是树,当且仅当下列5条之一成立。(或者说,这5条的任一条都可作为树的定义。)
- 无环且m=n-1。
- 连通且m=n-1。
- 无环,但增加任一新边,得到且仅得到一个环。
- 连通,但删去任一边,图便不连通(n≥2)。
- 每一对结点间有唯一的一条通路。(n≥2)。
无向图中的生成树与最小生成树
下面介绍求 TG 的克鲁斯克尔(Kruskal) 算法。
此方法又称为 “避环法”。其要点是,在与已选取的边不成圈的边中选取最小者。具体步骤如下:
(1)在G中选取最小权边,置边数 i=1。
(2)当 i=n-1时,结束。否则,转3)。
(3)设已选择边为 e1,e2,…,ei,在G中选取不同于 e1,e2,…,ei 的边 ei+1,使{e1,e2,…,ei,ei+1} 无环且 ei+1 是满足此条件的最小权边。
(4)置 i 为 i+1,转(2)。
例 7.5.4:求图 7.5.4(0)中有权图的最小生成树。
解:因为图中 n=8,所以按算法要执行 n-1=7次,其过程见图 7.5.4中(1) ~ (7)。
例 7.5.5:求图 7.5.5中有权图G的最小生成树。
解:因为图中 n=8,所以按算法要执行 n-1=7次。
例 7.5.6:图 7.5.6 所示的赋权图G表示七个城市 a,b,c,d,e,f,g 及架起城市间直接通讯线路的预测造价。试给出一个设计方案使得各城市间能够通讯且总造价最小,并计算出最小造价。
解:该问题相当于求图的最小生成树问题,此图的最小生成树为图 7.5.6中的 TG,因此如图 TG 架线使各城市间能够通讯,且总造价最小,最小造价为:
W(T)=1+3+4+8+9+23=48
根树及其应用
有向树
定义 7.6.1:一个有向图,若不考虑边的方向,它是一棵树,则这个有向图称为有向树。一棵有向树,如果恰有一个结点的入度为0,其余所有结点的入度都为1,则称为根树,其中入度为0的结点称为树根,出度为0的结点称为树叶,出度不为0的结点称为分枝点或内点。
如图 7.6.2(a) 表示一棵根树,其中 v1 为树根,v1,v2,v3 为分枝点,其余结点为树叶。习惯上我们把根树的根画在上方,叶画在下方。这样就可以省去根树的箭头,如图 7.6.2(b)。在根树中,称从树根到结点 v 的距离为该点的层次。这样对图7.6.2 中的根树,v1 的层次为0,v2、v3 的层次为1,其余结点的层次均为2。我们用家族关系表示根树中各结点的关系。
定义 7.6.2:在根树中,若从 vi 到 vj 可达,则称 vi 是 vj 的祖先,vj 是 vi 的后代;又若〈vi,vj〉是根树中的有向边,则称 vi 是 vj 的父亲,vj 是 vi 的儿子;如果两个结点是同一结点的儿子,则称这两个结点是兄弟。
定义 7.6.3:在根树中,任一结点 v 及其 v 的所有后代和从 v 出发的所有有向路中的边构成的子图称为以 v 为根的子树。根树中的结点 u 的子树是以 u 的儿子为根的子树。
在现实的家族关系中,兄弟之间是有大小顺序的,为此我们又引入有序树的概念。
定义 7.6.4:如果在根树中规定了每一层次上结点的次序,这样的根树称为有序树。我们在有序树中规定同一层次结点的次序是从左至右。
m叉树
在树的实际应用中,我们经常研究完全 m 叉树。
定义 7.6.5:在根树中,若每个结点的出度小于或等于 m ,则称这棵树为 m 叉树。如果每个结点的出度恰好等于0或 m,则称这棵树为完全 m 叉树。二叉树(binarytree)的每个结点 v 至多有两棵子树,分别称为 v 的左子树和右子树。
定理 7.6.1:在完全 m 叉树中,若树叶数为 t,分枝点数为 i,则:(m-1) i= t -1。
例 7.6.2:假设有一台计算机,它有一条加法指令,可计算3个数之和。如果要求9个数 x1,x2,…,x9 之和,问至少要执行几次加法指令?
解:用3个结点表示3个数,把9个数看成树叶,将表示3数之和的结点作为它们的父亲结点。这样本问题可理解为,求一个完全三叉树的分枝点的个数问题。
由定理 7.6.1 知,有(3-1) i=9-1,得 i=4。所以要执行4次加法指令。
图 7.6.5 表示了两种可能的顺序。
例 7.6.3:设有28盏灯,拟公用一个电源,则至少需要多少个4插头的接线板?
解:把28盏灯看成树叶,将4插头的接线板看成分枝点,这样本问题可理解为求一个完全四叉树的分枝点的个数 i 的问题。
由定理 7.6.1知,有(4-1) i=28 -1,得 i=9。
所以至少需要 9 个4插头的接线板。
例 7.6.4:8枚硬币问题。若有8枚硬币 a,b,c,d,e,f,g,h,其中7枚重量相等,只有1枚稍轻。现要求以天平为工具,用最少的比较次数挑出轻币来。
解:可用图 7.6.6 所示的树表示判断过程。
从图中可知,只需称 2 次即可挑出轻币。这种用于描述判断过程的树叫判定树。
最优二叉树
定义 7.6.6:设有一棵二叉树,有t片树叶。使其树叶分别带权 w1,w2,…,wt 的二叉树称为带权的二叉树。
定义 7.6.7:设有一棵带权 w1,w2,…,wt 的二叉树,权为 wi 的树叶的层为L(wi)。
例 7.6.5:求带权 7,8,9,12,16 的最优树。
解:全部过程见图 7.6.13 (a)~(d)。