第四章图
§4.1图
4.1.1图的基本概念
定义4.1.1.G=(P,L)称为图。如果P是点的非空集合,L是连接某些不同点对的边集合,并且任意一对不同点之间最多有一条边。当P为有限集时,G称为有限图。
设G=(P,L)是一个图,我们用P(G)表示G的(节)点集,用L(G)表示G的边集。设l∈L(G),并假设l是连接G中点u,点v的边,则称u,v是l的端点,并称u与v相邻。若l 1 ∈L(G),l 2 ∈L(G)。且l 1 和l 2 有公共的端点,则称边l 1 与边l 2 相邻。有时,在不至引起混乱的情况下,将l记为uv。若L(G)=ϕ,则称图G为零图。
例下图中,(a),(b)是图,且(a)是零图,(c)和(d)不是我们这里定义的图。(c)和(d)中出现的特殊的边我们称为平行边和反身边。
定义4.1.2.设G,H是图,如果P(H)⊆P(G),L(H)⊆L(G)。则称H是G的子图,G是H的母图。如果H是G的子图,并且P(H)=P(G),则称H是G的支撑子图。如果H是G的子图,且L(G)中两个端点都在P(H)中的边都在L(H)中,则称H为点集P(H)在G中诱导的子图。
定义4.1.3.设G是图,v∈P(G),L(G)中以v为端点的边条数称为点v的度,记为d G (v)。为简便计,有时也将图G中的点v,边l,写成v∈G,l∈G。
设G=(P,L)是有限图,集合P的元数为m,集合L的元数为n,不妨设P(G)={v 1 ,⋯,v m },L(G)={l 1 ,⋯,l n }。矩阵M(G)=[a ij ]称为G的关联矩阵,其中
a ij ={0,当v i 不是l j 的端点;1,当v i 是l j 的端点。
M(G)是m×n阶矩阵。
例如,下面是一个图及其关联矩阵。
M(G)=⎛ ⎝ ⎜ ⎜ ⎜ 1100 0110 0011 1001 1010 ⎞ ⎠ ⎟ ⎟ ⎟
因为图G中一条边只有两个端点,故矩阵M(G)中每一列恰有两个1.M(G)中每行中1的个数恰是该行所代表的点v的度d G (v)。
一个图可以用其关联矩阵表示,也可用下面的所谓相邻矩阵
A(G)=[b ij ]表示,其中
b ij ={0,当v i 与v j 不相邻;1,当v i 与v j 相邻。
例如,上面图的相邻矩阵为:
A(G)=⎛ ⎝ ⎜ ⎜ ⎜ 0111 1010 1101 1010 ⎞ ⎠ ⎟ ⎟ ⎟
A(G)是m×m阶方阵,并且A(G)中第i行与第i列中的1的个数相同,它们恰是第i行(列)所代表的点v的度d G (v)。
定理4.1.1.设G=(P,L)是有限图,不妨设L(G)含有m个元素,于是∑ v∈P(G) d G (v)=2m
证:设M(G)是G的关联矩阵,因为G中某点v的度d G (v)恰是M(G)中的代表点v的那一行中1的个数,故∑ v∈P(G) d G (v)=M(G)中1的个数,而M(G)中每列恰有两个1,M(G)共有m列,故M(G)中1的个数为2m。所以∑ v∈P(G) d G (v)=2m
定理4.1.2.任一有限图中,奇数度的点的个数为偶数。
证:设S 1 ,S 2 分别是图G中有奇数度的点和有偶数度的点的集合,由定理4.1.1知∑ v∈S 1 d G (v)+∑ v∈S 2 d G (v)是偶数。因为∑ v∈S 2 d G (v)是偶数。所以∑ v∈S 1 d G (v)是偶数,故S 1 的元数是偶数。
定义4.1.4.设G=(P,L)是图,v,v ′ 是G中两点。由G中点组成的序列(v 0 ,v 1 ,⋯,v n )称为从v到v ′ 的长度为n的路,如果1)v 0 =v,v n =v ′ ;2)v i 与v i+1 相邻,0≤i<n。这里v,v ′ 是图G中未必不同的两点,v 0 ,v 1 ,⋯,v n 中也许有重复。
定义4.1.5.设G=(P,L)是图,(v 0 ,v 1 ,⋯,v n )是G从v 0 到v n 的路,称此路为简单路,如果1)v 0 ,⋯,v n−1 互不相同;2)v 1 ,⋯,v n 互不相同。
一条简单路(v 0 ,v 1 ,⋯,v n ),除v 0 与v n 可以相同外,其它任意两点都不相同。
定义4.1.6.设G=(P,L)是图。G中从点v到自身的长度不小于3的简单路称为回路。
设G=(P,L)是图,G中两点u,v,如果从u到v有一条路,则称u与v是相连的。如果我们认为点v与自身是相连的,则G中两点之间的相连关系是一个等价关系。在此等价关系下,集合P(G)必分成一些等价类,不妨设为S 1 ,⋯,S n ,⋯。每一个S i 和G中所有以S i 中的点为端点的边一起,组成G的一个子图G i 。每个G i 称为G的一个连通分支。如果图G仅有一个分支,则称图G是连通的。对于图G,我们用W(G)记其连通分支数。
一个图G是连通的,当且仅当G中任意两点都是相连的。
4.1.2权图Dijkstra算法
定义4.1.7.设G=(P,L)是有限图,如果对L(G)中任一条边l,都规定一个实数w(l)附在其上,则称G为有限权图,称w(l)为边l的权。
规定w(uu)=0(其中u∈P(G)),w(uv)=∞(其中uv∉L(G))
例如,一个描述各城市之间的铁路交通图,图中的每一边可以用这条边所表示的铁路长度为其权,于是这个铁路交通图就是权图。也可以用每条边所代表的铁路修建费为其权,构成另一个权图。
如下图中,w(AB)=6,w(AA)=0,w(AC)=∞,w(AD)=10。
在一个权图G中,任给两点u、v,从u到v可能有几条路,在这些路中,求出所带的权最小的路径就是图中求最短路问题。这条最短路所带的权称为u到v的距离,记为d(u,v)。
两点间的最短路一定是简单路,所以在网络中找最短路只需在简单路中找。如上图中,A到D的所有简单路有:(1)(A,F,E,D)长度为6,(2)(A,F,E,B,C,D)长度为13,(3)(A,F,C,D)长度为3,(4)(A,F,C,B,E,D)长度为14,(5)(A,D)长度为10,(6)(A,B,E,D)长度为13,(7)(A,B,E,F,C,D)长度为14,(8)(A,B,C,D)长度为12,(9)(A,B,C,F,E,D)长度为17。所以A到D的最短路为(A,F,C,D);A到D的距离为3。
上述求最短路的方法是枚举法,对于大型复杂图不合适。
1959年,Dijkstra给出了一个在权图中求其任意两点间最短路的算法。在介绍该算法之前,先讨论有限权图中点到点集之间的距离:设G是有限权图,S⊆P(G),u 0 ∈S,S ′ =P−S,定义u 0 到S ′ 的距离d(u 0 ,S ′ )=min v∈S ′ {d(u 0 ,v)}实现上述距离的路称为u 0 到S ′ 的最短路。上述点到点集距离的定义定价于d(u 0 ,S ′ )=min u∈S,v∈S ′ {d(u 0 ,u)+w(u,v)}
例如在上图中,令S={A,B,F},则S ′ ={C,D,E},求d(A,S ′ )?
设u 0 =A,min v∈S ′ {d(AA)+w(Av)}=min v∈S ′ {w(Av)}=10;取u=B,则d(AB)=6,w(BC)=5,w(BD)=∞,w(BE)=4,min v∈S ′ {d(AB)+w(Bv)}=6+4=10;取u=F,则d(AF)=1,w(FC)=1,w(FD)=∞,w(FE)=2,min v∈S ′ {d(AF)+w(Fv)}=1+1=2;因而d(A,S ′ )=2,A到S ′ 的最短路为(A,F,C)。这里的d(AB)=6,d(AF)=1是预先计算的。为实现这种预先的计算,必须进行迭代。
Dijkstra算法恰是这种思想。即不是孤立地求有限权图中两点间的距离为最短路,而是统筹考虑,算法终止时是一次性地求出某一点到所有其余各点之间的距离于最短路。
Dijkstra算法(在有限连通权图G=(P,L)中求u 0 点到所有其余各点之间的距离与最短路):
初始时令S={u 0 },S ′ =P−S,则d(u 0 ,S ′ )=min u∈S,v∈S ′ {d(u 0 ,u)+w(u,v)}=min v∈S ′ {d(u 0 ,v)}
设实现d(u 0 ,S ′ )的路为l 1 =(u 0 ,u 1 ),则l 1 是u 0 到u 1 的最短路,即d(u 0 ,S ′ )是u 0 到u 1 的距离d(u 0 ,u 1 )。令S={u 0 ,u 1 },S ′ =P−S,求出d(u 0 ,S ′ )。设实现d(u 0 ,S ′ )的路为l 2 =(u 0 ,u ′ 1 ,u 2 ),则l 2 是u 0 到u 2 的最短路,即d(u 0 ,u 2 )=d(u 0 ,S ′ )。设u 0 到u 1 ,u 2 ,⋯,u k−1 的距离和最短路通过迭代已经求得,则设S={u 0 ,u 1 ,u 2 ,⋯,u k−1 },S ′ =P−S。于是由d(u 0 ,S ′ )=min u∈S,v∈S ′ {d(u 0 ,u)+w(u,v)}可求出d(u 0 ,S ′ )。
设实现d(u 0 ,S ′ )的路是l k =(u 0 ,u ′ 1 ,⋯,u ′ r ,u k ),则l k 是u 0 到u k 的最短路,且u 0 到u k 的距离d(u 0 ,u k )=d(u 0 ,S ′ )。当S=P时,算法停止。(通过不断迭代,S逐渐增加,S ′ 逐渐减少,而P有限,所以在有限步内由S=P,S ′ =ϕ,从而求出u 0 到所有其余各点之间的距离与最短路。)
下面证明Dijkstra算法的正确性。
定理4.1.3.设G=(P,L)是有限连通权图,S⊆P(G),S={u 0 ,u 1 ,⋯,u k },并且已经知道了u 0 分别到u 1 ,⋯,u k 的距离与最短路l 1 ,⋯,l k 。又设S ′ =P−S,d(u 0 ,S ′ )=lim u∈S,v∈S ′ {d(u 0 ,u)+w(u,v)}是u 0 到集合S ′ 的距离,l k+1 =(u 0 ,u ′ 1 ,⋯,u ′ s ,u k+1 )是实现d(u 0 ,S ′ )的路,其中u 0 ,u ′ 1 ,⋯,u ′ s ∈S,u k+1 ∈S ′ 。则u 0 到u k+1 的距离d(u 0 ,u k+1 )=d(u 0 ,S ′ ),且l k+1 是u 0 到u+1的最短路。
证:用|l|表示l上所带权的和,则|l k+1 |=d(u 0 ,S ′ )。设l=(u 0 ,v 1 ,⋯,v r ,u k+1 )是u 0 到u k+1 的任意一条路,以下证明|l|≥|l k+1 |。
1)若v 1 ∈S ′ ,即l的第一步就进入S ′ ,则|l|=w(u 0 ,v 1 )+w(v 1 ,v 2 )+⋯+w(v r ,u k+1 )≥w(u 0 ,v 1 )≥min u∈S,v∈S ′ {d(u 0 ,u)+w(u,v)}=d(u 0 ,S ′ )=|l k+1 |。
2)若u 0 ,v 1 ,⋯,v r ∈S,即l是在S中走,最后一步到达u k+1 ,则|l|=|(u 0 ,v 1 ,⋯,v r ,u k+1 )|=|(u 0 ,v 1 ,⋯,v r )|+w(v r ,u k+1 )≥d(u 0 ,v r )+w(v r ,u k+1 )≥min u∈S,v∈S ′ {d(u 0 ,u)+w(u,v)}=d(u 0 ,S ′ )=|l k+1 |。
3)若u 0 ,v 1 ,⋯,v i ∈S,而v i+1 ∈S ′ ,其中1≤i<r,即l的第一步在S中,中途跑出S到S ′ ,最后到达u k+1 。则|l|=|(u 0 ,v 1 ,⋯,v r ,u k+1 )|≥|u 0 ,v 1 ,⋯,v i ,v i+1 )|=|(u 0 ,v 1 ,⋯,v i )|+w(v i ,v i+1 )≥d(u 0 ,v i )+w(v i ,v i+1 )≥min u∈S,v∈S ′ {d(u 0 ,u)+w(u,v)}=d(u 0 ,S ′ )=|l k+1 |。综上的l k+1 是从u 0 到u k+1 的最短路其距离d(u 0 ,u k+1 )为d(u 0 ,S ′ )。