图和网络问题

图的深度优先搜索的应用:

 

一 图的接合点

 

性质1 当且仅当深度优先搜索树的根结点至少有两个以上儿子,则根结点是接合点。

性质2 当且仅当深度优先搜索树中,v的每个儿孙结点不能通过后向边到达v的祖先结点,则结点v是接合点。

 

二 有向图的强连通分支

 

三 最大容量扩张算法(寻找网络的最大流量)

 

(最大容量最小割集定理)令(G,s,t,c)是一个网络,f是G中的流量,则下面的3个命题等价:

(1) 存在一个容量为c(S,T) = | f |的割集{S,T}。

(2) f是G中的最大流量。

(3)不存在f的扩张路径。

 

所以寻找网络的最大流量实际上就是使网络中不存在扩张路径。最大容量扩张算法和最短路径扩张算法就是以此为基础的。

 

最大容量扩张(MCA)的步骤如下:

(1) 初始化剩余图R的容量r(u,v) = c(u,v),网络流量f(u,v) = 0。

(2) 如果R中存在扩张路径,则找出瓶颈容量m最大的扩张路径p,令f = f + m,f(u,v) = f(u,v) + m,r(u,v) = r(u,v) - m,r(v,u) = r(v,u) + m。

(3) 重复进行第2步直至R中不存在扩张路径。

 

搜索扩张路径的方法是从源点s出发,用图的深度优先搜索方式遍历剩余容量r > 0且没有被访问过(即顶点i不会构成回路,搜索路径数组path[]中不包含顶点i)的顶点i,将顶点i登记到搜索路径数组path[]中,到达收点t后计算扩张路径的瓶颈容量,并与之前搜索到的扩张路径的瓶颈容量比较,取大值,保存搜索路径。

 

 

图的广度优先搜索的应用:

 

一 最短路径扩张算法(寻找网络的最大流量)

 

最短路径扩张算法(MPLA)和最大容量扩张算法区别主要在搜索扩张路径上的方法。

 

搜索扩张路径的方法是从源点s出发,用图的广度优先搜索方式遍历剩余容量r > 0且没有被访问过(即顶点i的级仍为初始值)的顶点i,令level(i) = level(w) + 1(w为i的前一顶点),并将顶点w做为顶点i的前一顶点登记到搜索路径数组path[]中(即path[i] = w),到达收点t后说明已找到最短扩张路径,沿着path数组计算瓶颈容量cap,结束此次搜索。

 

二 二分图的最大匹配问题

 

定理 无向图G中的匹配M是最大匹配,当且仅当G不包含M的扩张路径。

 

这里的扩张路径和网络流量中的扩张路径不是同一个概念,注意不要混淆。

 

若G中存在着一条由匹配边和自由边交替组成的路径p,则称p为交替路径。若交替路径p的两个端点重合,则称p是交替回路。若交替路径p的两个端点都是自由的(即起始边和结束边都是自由边),则称p是M的扩张路径。

 

显然,若p是交替回路,则p的边数必为偶数,且匹配边和自由边数目相同;路径上所有的点都是匹配点。若p是M的扩张路径,则p的边数必为奇数,且p不会构成回路;除两个端点外,中间的点都是匹配点。

 

定理 图G是二分图,当且仅当G中没有奇数长度的回路。

 

在二分图中寻找最大匹配采用匈牙利树法。

 

算法步骤如下:

(1) 匹配M初始化为空(match[] = -1)。

(2) 在顶点集X中选取自由顶点r,以r为根结点出发,用图的广度优先搜索方式构造一棵交替路径树T。

(3) 如果T是一棵匈牙利树,则从图G中删去T(删除路径上的边);否则反转扩张路径的边(更新路径上所有点的match值),即将匹配边变为自由边,自由边变为匹配边,此时匹配边数增加了1,路径上的所有点都变为匹配点(即点的match值不为-1)。

(4) 重复步骤(2)(3),直到顶点集X中无自由顶点为止,此时match[]中记录的是二分图的最大匹配。

 

构造交替路径树T的步骤如下:

(1)在顶点集X中选取自由顶点r,以r为根结点出发,用图的广度优先搜索方式遍历顶点集Y中的顶点y,将所有边(r,y)(此边必为自由边)加入T,登记前驱结点(path[y] = r),顶点y的tag标志置0(说明y与前方顶点的关联边是自由边)。

(2)如果搜索队列首元素顶点w的tag为0(此时可能需要添加匹配边),分以下两种情况:1.顶点w是自由顶点(match[w] = -1),说明已找到扩张路径,T不是匈牙利树,置flag标志为TRUE,记录w为扩张路径的端点,结束此次构造;2.顶点w是匹配点,将匹配边(w,u)(只有一条,match[w] = u)加入T,登记前驱结点(path[u] = w),置顶点u的tag标志为1(说明u与前方顶点的关联边是匹配边)。

(3) 如果搜索队列首元素顶点w的tag为1(此时可能需要添加自由边),分以下两种情况:1.如果存在相邻边,将与之相连的所有边(w,v)(顶点v未曾访问过)加入T(此边必为自由边),登记前驱结点(path[v] = w),置顶点v的tag标志为0;2.如果不存在,说明路径在顶点在w处被阻塞,无法扩张,记录阻塞顶点(block[w] = TRUE)。

(4) 重复步骤(2)(3),直到搜索队列为空或已找到扩张路径结束此次构造。

 

注意:

1.自由点的match值为-1,匹配点的match值一定不为-1。

2.证明T是匈牙利树一定要搜索到整个队列为空,且flag标志为FALSE(即所有叶子结点被阻塞)。

 

如果在检索扩张路径的过程中,检索到一棵匈牙利树,就可以永久地把它从G中删去,而不影响检索。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值