§4.3有向图
4.3.1有向图与有向树
定义4.3.1.G=(P,A)称为有向图,如果P是点集合,A是从一点引到一点(不要求一定是另一点)的弧集合。当P为有限集时,G称为有限有向图。
若e是一条从点v到点v ′ 的弧,则称v为e的起点,记为v=init(e);v ′ 为e的终点,记为v ′ =fin(e)。
起点和终点都是v的弧称为反身弧,有向图两点(可以相同)间的弧可以有无穷条。有限有向图中的集合A未必是有限集。即,有限有向图中的弧可以有无穷多条。
有向图中点v的输出次数(出度)是集合{e|init(e)=v}的元数;点v的输入次数(入度)是集合{e|fin(e)=v}的元数;点v的度等于点v的输入次数加输出次数.
为简便计,有时也将有向图G中的点v、弧e写成v∈G,e∈G。
定义4.3.2.是G,H是有向图。如果P(H)⊆P(G),A(H)⊆A(G),则称H为G的有向子图,并且P(H)=P(G),则称H是G的支撑子图。
定义4.3.3.设G=(P,A)是有向图,弧序列(e 1 ,⋯,e n )称为G的从v到v ′ 其长度为n的有向路,如果1)e i ∈A(G),i=1,2,⋯,n2)v=init(e 1 ),v ′ =fin(e n )。3)fin(e k )=init(e k+1 ),1≤k≤n−1。
在不引起混乱的情况下,有时也将有向路(e 1 ,⋯,e n )写成(v 1 ,⋯,v n ,v n+1 ),其中v i =init(e i )(i=1,⋯,n),v n+1 =fin(e n )。
定义4.3.4.有向图的有向路(e 1 ,⋯,e n )称为简单的,如果1)init(e 1 ),⋯,init(e n )互不相同,2)fin(e 1 ),⋯,fin(e n )互不相同.
定义4.3.5.设G=(P,A)是有向图,v∈P(G),从点v到自身的简单有向路(长度可以为1或2)称为有向回路。
例如,在下图中,弧e 1 的起点是A,终点是B;点A的输出次数为1,输入次数为1;点B的输入次数为2,输出次数为0,点F的输入次数为3,输出次数为4;(e 2 ),(e 3 ,e 4 ,e 2 ),(e 3 ,e 5 ,e 6 ,e 10 ,e 2 ),(e 3 ,e 5 ,e 6 ,e 7 ,e 1 )是从C到B的4个有向路。这4条有向路只有第一条,第四条是简单的;(e 3 ,e 4 ),(e 3 ,e 5 ,e 6 ,e 10 ),(e 8 ),(e 9 )是4条有向回路;有向图G中,从B到其它任意点都没有有向路。
定义4.3.6.设G=(P,A)是有向图,对G中任意两点v,v ′ (v≠v ′ ),如果都有从v到v ′ 的有向路,则称G是强连通的。
定义4.3.7.设G=(P,A)是有向图,r∈P(G)。称r为G的根,如果对于G中任意一点v(v≠r),都有从v到r的有向路。
强连通图的每一点都是根,反之,每一点都是根的有向图也必是强连通的。
每一个有向图G,都对应一个图G 0 (只要将G中的弧看作边,且两点间的多条弧看作一条边,从一点到自身的弧都删去即可)。
若有向图G是强连通的,则G必有根,若有向图G有根,则图G 0 必连通。反之,不一定成立。即若G 0 连通,则G不一定有根;若G有根,则G未必强连通。
例如,上图(a)不是强连通的,但(a)有根B;(b)是强连通的;(c)有根r;将图(a),(b),(c)漠视成图后,所得图都是连通的。
定义4.3.8.有向图G称为有向树(或有根树),如果G中有一点r,并且满足:1)G中每一点v(v≠r)都恰是一条弧e的起点。2)r不是任一条弧的起点。3)r是根。在有向树的定义中,由1),3)知,对每点v,恰有一条从v到r的有向路,所以,在有向树中没有有向回路,故有向树中,任意两点间最多有一条弧。
例如,上图(c)就是一颗有向树,点r是根,图(a),图(b)所画出的有向图都不是有向树.
4.3.2Euler图
定义4.3.9.设G是有向图,G中有一条Euler路,就是一条有向路(e 1 ,⋯,e n ),其中fin(e n )=init(e 1 ),而且G中每条弧在此有向图中恰出现一次。
注意,Euler路未必是有向回路,因为它未必是简单的。例如上图中的有向图G,其中(e 1 ,e 2 ,e 3 ,e 4 )是Euler路,但不是A=fin(e 4 )=init(e 1 )的简单有向路。从图中还可以看到,G中的每个点未必在Euler路中恰好经过一次;G中的点可以不在Euler路中出现(如上图的D、E),也可以出现多次(如点B)。
定义4.3.10.设G是有向图。G中点v说是孤立的,如果v的输入和输出次数全为0;G说是平衡的,如果G中每点v,都有有限的输入输出次数,而且输入次数和输出次数相等。
于是,一有限平衡有向图,其弧数有限。一有向图若存在Euler路,则必平衡。因为Euler路每经过一点一次,该点就得到输入次数和输出次数各一次。若一点共被经过k次(k=0时是孤立的),则该点在这有向图中的输入次数和输出次数就都是k。Euler图中每个点所触及的弧必为偶数条(输入输出各半)。下图是一有限平衡有向图。
(e 00 ,e 01 ,e 12 ,e 22 ,e 21 ,e 10 ,e ′ 01 ,e ′ 12 ,e 20 )是其中一条Euler路。
一个Euler图G,如果没有孤立点,则必强连通。G的全部点都出现在一条有向路上,即出现在Euler路上。其中,init(e 1 )=fin(e m )。沿着这条路线走两圈,总能够先到达任一给定的顶点v,然后再到达另一个任给的顶点v ′ 。即对任意的v、v ′ ,都存在从v到v ′ 的有向路。
Euler路实际上是一条封闭的一笔画路线。
定理4.3.2.设G是无孤立点的有限有向图。于是,G有Euler路当且仅当G是平衡的,并且强连通。
证:必要性显然成立。充分性,由于G没有孤立点,所以G的任一点至少发出一条弧,于是G中存在至少一条有向路,并且在该有向路中没有弧被重复使用。因为G是平衡的,所以G中弧数有限,所以这样的路也有限。设L=(e 1 ,⋯,e m )是由无重复弧构成的有向路中的最长者,往证L是Euler路。1)证明init(e 1 )=fin(e m ).A.设v=fin(e m ),往证由v发出的所有弧都在L中。反证法,若e不在L中,且init(e)=v,则(e 1 ,⋯,e m ,e)就是一条比L更长的由无重复弧构成的有向路,矛盾。B.证明由v发出的k条弧中,必有e 1 ,即证:由v发出的k条弧必有一条排在L的前面。反证法,若从v发出的k条弧中无e 1 ,则设这k条弧是e i1 ,e i2 ,⋯,e ik ,其中2≤ij≤m,因为e i1 ,e i2 ,⋯,e ik ,从v发出且都是在有向路L中,则必有e i1−1 ,e i2−1 ,⋯,e ik−1 ,射入v,且1≤ij−1≤m−1,即至少有k条弧射入v,这k条弧中不包括e m ,因为e m 也射入v,于是至少有k+1条弧射入v,即v的输入次数至少是k+1,而输出次数是k,矛盾。同理,G中发到v的k条弧也都出现在L中,并且这k条弧中必有e m 。所以,在取L时,无论哪条弧作为第一条弧,可得L是一条从某点出发,到自身的有向路且弧不重复。2)证明:G中所有的弧必恰好在L中出现一次。显然,只需证G的每条弧必在L中出现即可。对于L,若顶点v在L中,则用1)中的方法可以证明,从v出发到所有弧都在L中。设e是G的一弧,u=init(e),任取L中一点v,因为G强连通,v,u间有有向路(e ′ 1 ,e ′ 2 ,⋯,e ′ i )且init(e ′ 1 )=v,fin(e ′ i )=u,因v在L中,e ′ 1 是由v发出弧,所以e ′ 1 在L中,因此fin(e ′ 1 )=init(e ′ 2 )=v ′ 1 在L中,所以e ′ 2 在L中,同理,e ′ i 的终点u在L中,所以e在L中。由e的任意性知,G中弧均出现在L中。综上,L是一条Euler路。
推论:设G是无孤立点的有限有向图,于是,G是Euler路当且仅当G平衡,并且将G漠视为图G 0 时是连通的。
定理4.3.3.设G是无孤立点的有限有向图,并且G有一条Euler路(e 1 ,⋯,e m )。令r=fin(e m )=init(e 1 ),对每个点v≠r,令e[v]=e i ,其中i=max{j|init(e j )=v}。于是,G的全部点和全部弧{e[v]|v≠r}做成的有向图G ′ ,是一个以r为根的有向树。
证明:由e[v]的定义知:(1)对每个点v≠r,恰有一弧e[v]自己发出,(2)r不发出任何弧。下面证明:(3)r是根。
首先证明,有向图G ′ 中无有向回路。若不然,设有一个有向回路:(⋯,e[v],e[v ′ ],⋯)其中fin(e[v])=init(e[v ′ ])=v ′ 。令e[v]=e j ,e[v ′ ]=e j ′ 。因为弧e j 发到点v ′ 。从而e j+1 是由v ′ 发出的弧,但e j ′ 是由v ′ 发出的弧中足码最大者,所以j<j ′ 。有向图回路又可写成:(e[v ′ ],⋯,e[v])与上面同样的推理,可得:j ′ <j。矛盾。
其次证明:对G中任一点v,在G ′ 中,有一条从v到r的有向路。在G ′ 中,从v出发可以这样走:v→fin(e[v])→→⋯
此有向路上的点没有重复(否则,将出现有向回路),由于G ′ 有限,故最后必然停止在不发出弧的点r上,故G ′ 是一个有向树。
此定理给出了一个由Euler路线得出有向树的方法;反过来,由一个有向子树可否得到一条Euler路?这可由下面定理来回答。
定理4.3.4.设G是有限平衡有向图,G ′ 是G的有向支撑树(即G ′ 是G的有向支撑子图且G ′ 是有向树),设G ′ 的根为r,G ′ 中点v(≠r)发出的弧为e[v]。设e 1 是r在G中发出的任一条弧,如果从e 1 开始任一条有向路:L(e 1 ,e 2 ,⋯,e m )满足:(1)e j ≠e k ,当j≠k时.(2)e j =e[v]当且仅当init(e j )=v并且G中由v发出的弧都出现在(e 1 ,⋯,e j )中。(3)L终止在e m 当且仅当G中从e m 的终点发出的弧都已经在L中出现。则有向路L是一条Euler路。
证明:首先证明fin(e m )=init(e 1 )=r。由条件(3)知,由fin(e m )发出的弧,都在L中。仿照定理4.3.2的证明,不难得到结论:fin(e m )发出的弧中,有一条是e 1 ,即fin(e m )=init(e 1 )。其次证明G中每条弧恰在L中出现一次,但由条件(1)知,只需证明:G中每条弧都出现在L中。
若不然,设G中的弧e不在L中。令fin(e)=v。由L的平衡性知,G中有一条v发出的弧e ′ 不在L中,特别,当v≠r时,由条件(2)知,e[v]不在L中。同理,当fin(e[v])≠r时,e[fin(e[v])]不在L中,⋯,以此类推。得一有向路:L ′ =(e,e[v],e[fin(e[v])],⋯)并且L ′ 中的弧不在L中,L ′ 中的弧都是G ′ 的弧(除e以外)。L ′ 不能无限延长下去,最后必然沿着G ′ 的一条有向路达到r。于是,根据上面的推理,有一条从r出发的弧不在L中。与条件(3)矛盾,故G中的弧都出现在L中。并且L是G的一条Euler路。
例4.3.1.试看上图中有向图G,命G ′ 是G中由顶点v 0 ,v 1 ,v 2 和e 01 ,e 21 组成的有向子树(根r=v 1 )。从弧e 12 出发,可按照定理4.3.4的形成规则得出Euler路若干,计有8条之多:
(e 12 ,e 20 ,e 00 ,e ′ 01 ,e 10 ,e 01 ,e ′ 12 ,e 22 ,e 21 )
(e 12 ,e 20 ,e 00 ,e ′ 01 ,e ′ 12 ,e 22 ,e 21 ,e 10 ,e 01 )
(e 12 ,e 20 ,e ′ 01 ,e 10 ,e 00 ,e 01 ,e ′ 12 ,e 22 ,e 21 )
(e 12 ,e 20 ,e ′ 01 ,e ′ 12 ,e 22 ,e 21 ,e 10 ,e 00 ,e 01 )
(e 12 ,e 22 ,e 20 ,e 00 ,e ′ 01 ,e 10 ,e 01 ,e ′ 12 ,e 21 )
(e 12 ,e 22 ,e 20 ,e 00 ,e ′ 01 ,e ′ 12 ,e 21 ,e 10 ,e 01 )
(e 12 ,e 22 ,e 20 ,e ′ 01 ,e 10 ,e 00 ,e 01 ,e ′ 12 ,e 21 )
(e 12 ,e 22 ,e 20 ,e ′ 01 ,e ′ 12 ,e 21 ,e 10 ,e 00 ,e 01 )
4.3.3无向图
定义4.3.11.允许有平行边和反身边的图G=(P,L)称为无向图,其中P为(节)点集,L称为线集(包括平行边和反身边)。
定义4.3.12.设G=(P,L)为无向图,l∈G。如果W(G−l)>W(G)则称l为G的断线。对于断线,有下述结论:(1)l是G的断线的充要条件是l不在G的回路上。(2)设P=S 1 ∪S 2 ,S 1 ∩S 2 ≠ϕ,若T={l|l∈G,x∈S 1 ,y∈S 2 ,x,y为l的端点}仅有一个元素l,则l是G的断线。(3)设G ′ =(S,L ′ )是无向图G=(P,L)的子图,若l是G的断线,且l∈L ′ ,则l是G ′ 的断线。(4)若有限无向图G的每点的度都是偶数,则G中无断线。
在无向图G中讨论Euler路问题,是考虑能否对G中的线加上适当的方向,使之构成的有向图为Euler图。即若无向图G中存在无重复线的路L=(l 1 ,⋯,l m ),满足G中任意线都在L中,且l 1 的起点与l m 的终点相同,则称无向图G为Euler图。反之,若L=(l 1 ,⋯,l m )是无向图G的Euler路,则沿着路L的走向对各线l i 加方向,得到有向图Euler图。
定理4.3.5.设G为有限无向图。则G有Euler路当且仅当G中每点的度是偶数,并且漠视为图后是连通的。
推论:漠视图为连通图的无向图G,有一条点u到点v(u≠v)的路经过所有线恰好一次,当且仅当G中仅有u和v的度数为奇数。
证明:在u与v之间再加一线uv连接起来,得到无向图G ′ ,则G ′ 中每点的度是偶数,并且漠视为图后是连通的。于是由定理4.3.5知G ′ 为Euler图。从而有Euler路L=(l 1 ,⋯,l m ),线uv(或vu)为某个l i ,删除l i 即得G中点u到点v路经过所有线恰好一次的路。反之亦然。
在无向图G=(P,L)中,找Euler路的Fleury算法。1)任取v 0 ∈G,令W 0 =(v 0 );2)假设W i =(v 0 ,⋯,v i )已经确定,其中v k 与v k+1 之间的线记为l k+1 ,k=0,⋯,i−1。按如下规划选取G中的线l i+1 :(1)l i+1 的一个端点为v i ;(2)令L i =L−{l 1 ,⋯,l i },G i =(P,L i )。如果G i 中有以v i 为端点的线,则以非断线为优先取之。如果G i 中无以v i 为端点的线,则算法停。