当先锋百科网

首页 1 2 3 4 5 6 7

(本文为作者期末复习时所写,内容源自教材《图论与代数结构》戴一奇等著,结合了作者本人的一些理解,如有错误,请指出!)

2.1道路与回路

1.【定义】(有向图)简单有向道路 简单有向回路:边不重复出现

初级有向道路 初级有向回路:点不重复出现

2.【定义】(无向图)有向道路 有向回路:点边交替序列

3.【定义】弦

【定理】简单图G中,若每一个点的度数d(v)>=3,则G中一定含有带弦回路

证明思路:(构造法)在G中找到一条极长初级道路,道路的上的点分别记为v0,v1,v2...对于v0,与其相邻的点除了v1外至少有两个,这些点应该在这条初级道路上,否则这条初级道路将可以延长,不符合题目中的“极长”。不妨设\Gamma (v0)={v1,vj,vk...}.此时,{v0,v1...vk,v0}是一条初级回路,(v0,vj)是其中一条弦。

4.【定义】二分图

【定理】二分图中任一回路的边数一定为偶数

证明思路:二分图中节点集可划分为X,Y,从任意节点出发,一定需要经过偶数条边才能回到原来的节点集。

5.【定义】(无向图)连通图:任意两节点之间都存在道路

6.【性质】(无向图)树:任意两节点之间都只有唯一一条初级道路;树是含边数最少的连通图

7.【例题】G是简单图,证明当m>(n-1)(n-2)时,G是连通图

思路:(反证法)至少含有两个连通支,设其中一个连通支的点数为k,求出边的最大数量,放缩得m<=(n-1)(n-2)。

2.2道路与回路的判定

1.(无向图)判定两点间是否连通

(1)法一(判断任意两点间是否可达):邻接矩阵法(warshall算法)

算法理解:我们知道,邻接矩阵表示的是两点之间是否直接可达(aij=1表示i和j之间直接相连,aij=0表示i和j之间不直接可达但是可能间接可达),我们的目标是得到一个矩阵,这个矩阵中aij=1表示i和j之间直接或间接可达。

warshall算法中,第k次更新得到的邻接矩阵P(k)中,aij=1表示的是aij直接可达或者经由{1,2...k}间接可达。举例说明:P(0)是我们的初始矩阵(邻接矩阵),第一次迭代的时候发生了什么呢?我们试图求出一个矩阵,这个矩阵中,ij直接可达或者ij通过1可达,我们就把aij设为1.计算过程如下:第一步,我们先看P(0)的每一行的第一个元素,寻找哪一个元素可以到1,因为只有当这个元素可以到1时,我们才可以用1可达的点来拓展这个元素可达的点。我们发现a51=1,也就是5可以到1,现在我们已经锁定了矩阵的第5行,接下来我们准备更新第5行;第二步,我们寻找1可以到哪些点,我们发现a12=1,a13=1,也就是1可以到2和3;第三步,我们用1可达的点拓展5可达的点,因为存在路径5->1->2和5->1->3,我们就把矩阵的a52和a53更新为1.

P(0)=\begin{bmatrix} 0 &1 &1 &0 &0 \\ 0 &0 &1 &1 &0 \\ 0& 0& 0& 0& 1\\ 0& 0& 0& 0&0 \\ 1& 0 &0 &1 &0 \end{bmatrix}P(1)=\begin{bmatrix} 0&1 &1 &0 &0 \\ 0& 0& 1& 1& 0\\ 0& 0& 0& 0&1 \\ 0 & 0 & 0 & 0 & 0\\ 1& 1 &1 &1 & 0 \end{bmatrix}

我们重复这个动作,直到得到了P(5),迭代结束。

复杂度分析:n次迭代,第k次迭代时,先遍历第k列寻找1,最差情况是这一列全是1,也就是说,更新的时候需要把整个矩阵更新(n^2),因此,warshall算法时间复杂度为O(n^3)

(2)法二(判断给定v0和v1是否可达):搜索法(DFS和BFS)

DFS和BFS思路简单,在此不做分析。DFS和BFS中,每条边最多探测一次,时间复杂度为O(m)

2.3欧拉道路与回路

1.【定义】(无向图)欧拉回路:所有边经过且仅经过一次,回到原点

2.【判定】无向图有欧拉回路的充要条件:各节点度数为偶

3.【构造】求图中的欧拉回路:从图G中找到一条简单回路C,G1=G-C,G1中一定存在一个度不为0的点v,同时满足v在C中(否则原图G不连通),以v为始点,在G1中找到一个简单回路C1,C∪C1也是一个简单回路,重复该动作,直到简单回路中包含了G中所有边。

4.【推论】若无向连通图只有两个度为奇的节点,则存在欧拉道路

5.【推论】(有向图)G中各个节点正度负度相等,则存在欧拉回路

2.4哈密顿道路与回路

1.【定义】哈密顿回路:所有节点经过且仅经过一次 回到原点

2.【判定】简单图G有哈密顿回路的充分条件:

(1)简单图G任意两点度数之和>=n-1,则G中存在哈密顿道路

证明思路:(构造法)先有一条极长初级道路,基于这条极长初级道路构造出初级回路,再由这条初级回路拓展出更长的初级道路,最终拓展出所有点。

(2)简单图G任意两点度数之和>=n,则G中存在哈密顿回路

证明思路:(反证法)由(1)可知有H道路,假设无H回路,d(v0)=k,则d(vl)<=n-k-1,d(v0)+d(vl)<=n-1

(3)若G中每个节点的度都>=n/2,则存在H回路

3.【判定】简单图G存在哈密顿回路的充要条件:闭合图存在哈密顿回路

【定义】闭合图:若uv不相邻,且d(u)+d(v)>=n则增加边(u,v),重复该过程直至不能增加边,最终可得闭合图

4.【判定】一般情况下,判断一个图是否存在H回路需要用搜索法,复杂度为O(n!)

2.5旅行商问题(给定赋权完全图,求总长最短的H回路)

1.法一:分支与界法

理解:分支与界法本质上就是采用DFS的搜索,只不过适当剪枝,不用遍历所有情况

注意:每一步先计算d(s)值并与界值比较,若>=界值,则后续比d(s)更大的所有情况都不再考虑。

2.法二:便宜算法(近似算法)

每一步选取到回路最近的节点j,插入其中。假设(t,j)是相应的边,则需考虑将j插入t的前边还是后边:如果插入前边之后回路长度更小,则插入前边;否则插入后边。

2.6最短路径(负权无回路)

1.法一:Dijkstra算法(正权图 单源最短路径)

步骤:维护一个点集S,初始时S中只有源点,每次从E-S中选取距离源点最近的点,用这个点更新E-S中各点到源点的最短距离,并将这个点放入S中。

复杂度分析:每次操作分为两步,第一步是选取到原点距离最短的点,第二步是更新距离。因为每次放入一个点,所以共操作n次。对于第一步,选取最短点时,若采取遍历数组的方式,则复杂度为O(n),总共的复杂度为O(n^2);对于第二步,我们从整体上看,实际上我们更新时每条边用了1次,总共的复杂度为O(m). 综上,采取遍历数组时,D算法复杂度为O(m+n^2)

但是,实际上我们不一定需要采取遍历数组的方式选取到源点距离最短的点,我们可以使用优先队列,此时复杂度为O(nlogn),总体复杂度为O(nlogn+m)

2.法二:BFS(边权为一 单源最短路径)

过于straightforward 略

3.法三:Ford算法(边权可为负 单源最短路径)

我们先要明白为什么边权为负时Dijkstra算法失效:假设目前E-S中i到源点的距离最短,dist[i]=6;E-S中j到源点的距离为7,即dist[j]=7。此时,按照D算法的思路,我们应该把i加入S中(vis[i]=true),同时锁定dist[i]=6,即S中的所有点的dist都不会再被更新(我们更新时dist时,只更新未vis的点的dist)。下一步,我们要把j加入S中,再用j更新未vis的点的dist,实际上可能存在边(j,i)=-2,但是由于vis[i]==true,dist[i]已被锁定,所以此时dist[i]不会被更新为正确的7-2=5,而是维持原来的6.

Ford算法步骤:还是维护一个dist数组,每次迭代,我们用一个点的所有入度的dist去更新这个点的dist;迭代直到全部dist未变化。(“所有入度”这个说法来自于教材,网上大部分人的说法是每次迭代,“松弛每条边”,其实这两种说法体现在算法上是一样的)

复杂度分析:每次迭代都要遍历m条边,每次的复杂度是O(m),下面考虑迭代次数:最多为n次,因此总的复杂度为O(mn).为什么最多为n次呢?实际上,迭代次数与检查节点的顺序相关,但第i次后至少能得到i步之内的最短路。由于任意节点到源点最多m步,因此最多迭代次数为m.

2.7关键路径分析

1.PT图:

(1)节点表示工序,每个点的出度表示完成该节点所需的时间

(2)最早完工时间:v0到vi的最长路径长度

计算最长路径的步骤:

第一步,为节点重新标序。我们按照如下顺序寻找节点,依次从小到大标号:每次在图中寻找入度为0的节点,给它标号,并删去所有以它为始点的边。这个过程可以理解为,“完成”了该节点所代表的工序,因而“解除”了一些先决条件。

第二步,按照编号从小到大的顺序,依次计算每个点到源点(v0)的最长路径π(vi)。π(v0)=0。因为我们已经重新标号了,所以从v0到vi的最长路径上经过的点的标号一定小于i。又因为我们是从小到大计算π(vi)的,因次计算π(vi)时,比i小的节点的π我们都已经算完了。因此计算π(vi)只需从所有{入度节点的π+入边权值}中寻找最大值即可。

(3)工序的最晚启动时间

关键路径上的点时不能延误的,但是其他路径上的点或许可以晚一些启动。比如关键路径长度为39,v2不在关键路径上,而我们计算出来的π(v2)=10,这意味着v2工序最早在时间为10时启动,但是v2也许可以在11时启动,不影响整个工程在39时完工。但是V2启动的时间明显不能无限延迟,极端情况,如果v2在40时启动,整个工程肯定不能在39时完工了。现在问题来了,v2最晚能在什么时候启动不影响整个工程在39时完工呢?

计算公式:τ(vn)=π(vn)从后往前计算,即按照节点编号从大到小计算,每个节点的最晚启动时间τ(vi)为所有{出度节点最晚启动时间-出边权值}中的最小值

2.PERT图

(1)边代表工序,每条边的权值表示这个工序所花时间。节点表示"所有入边都完成了"。

(2)最早启动时间:依然可以用PT图的算法进行计算,得到π(vi)。此时每个节点的π值表示所有出边对应工序的最早启动时间

(3)最晚启动时间:依然可以用PT图的算法进行计算,得到τ(vi)。此时每条边(vi,vj)对应工序的最晚启动时间=τ(vj)-(vi,vj)边的权值

PT图和PERT图计算关键路径的复杂度都是O(m)

2.8中国邮路

中国邮路描述的问题是这样的:每条边都必须被访问到,如果原图有欧拉回路,则每条边都只需访问一次;但如果原图没有欧拉回路,则势必有的边需要被重复访问。我们想求满足条件的所有回路中长度最短的回路,这就是中国邮路问题。

1.无向图的中国邮路

【判定】判定一个回路是最佳邮路的充要条件:(1)每条边最多重复一次(2)在任意一个回路上,重复的边权之和小于未重复的边权之和

【构造】第一步:找出所有度为奇数的节点(一定可以找出偶数个),假设找出k个,在图中增加k/2条边,使得每个节点度数都变为偶数。第二步:按照判定条件(2)检查每一个回路,如果不满足要求,就把该回路上的重复的边变成不重复的,不重复的边变成重复的。直到所有回路都满足要求。

2.有向图的中国邮路

只考虑存在中国邮路的情况。(某些情况,比如某个点正度或负度为0,时,不存在中国邮路)

【构造】第一步,设立超发点s和超收点t。第二步,增加边。第三步,寻找从s到t的d(s)条最短路径,这d(s)条最短路径经过的边的就是原图中需要重复的边。