网络流匹配汇总

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二部图相关的一些性质
1.
二部图的最大匹配数ɑ’(G)等于最小顶点覆盖数ß(G)
如(图五),ae,bf,cg构成一个最大匹配,a,f,c构成一个最小顶点覆盖. 推荐题目:POJ 1325
a bcd
2. 任意图的最大独立集记为ɑ(G),那么ɑ(G)+ ß(G)=n
独立集是指任意两点之间没有边的顶点的集合
寻找M-增广路算法
输入:一个匹配和一个没被匹配覆盖的顶点u
algorithm augmenting path; begin
initialize LIST={u}; label node u ; while LIST≠φdo begin
delete a node i from LIST; for each arc (i ,j ) do
第二节 最大流
要解决的问题
最大流问题就是像(图六)所示的,有一 个源点s,一个汇点t,源点可发出和汇点可
3
接受的容量都为无穷大,然后那些有向边的
值代表最大能通过该边的容量。然后要求从 源点s最大能到达到汇点t的容量
s
5
32
1
2
3
t
如何解决
3
4
3
每次从源点s找条能增大现有流量的路径,
直到流量不能再增加为止
M[v]=u; return 1; } } return 0; } 执行一次path为O(m),共调用n次,故该算法的复杂度为O(nm) 完整的程序可参见:code\match.cpp 推荐题目:POJ 1469 (POJ 2239数据量相对较小) 注记:1.m表示图的边数,n表示顶点数,下同。 2.推荐题目括号内的题目表示是同一类题目,有兴趣可以做,解题报告不包括括号内的题,下同。
(图六)
a
a
3
1
0
0
图解寻s 增3广路t 径 s 0 t
1
3
0
0
b
b
原始图
a
第一步:流量初 始化为0
a
3
0
3
0
s
3
t
s
3
t
0
3
b
第二步:找到一条路 径,可以流过3的流量
0
3
b
好象从s只能到达b然后就不能流 了,然后最大流是3,是吗??
a
3
0
s
3
t
a
3
1
s
2
t
0
3
b
其实还可以从b再到a,代表取 消原先从a流向b的部分流量
3.如何得到二部图的每个部分
任意选一个顶点,所有到该点距离为偶数的点构成的集 合便是G中的一部分,距离为奇数的点为另一部分
X
Y
(图一)
最大匹配
1.何为匹配
图G的一个匹配是一组没有公共端点的边构成的集合,如(图一) 两条黑色的边构成一个大小为2的匹配,三条红色的边构成一个大 小为3的匹配.图中的最大匹配数就是3。
if node j is not in match then augment and return; else if arc (j ,k )∈M and k is not labeled then set pred(j ):=i add k to LIST and label k; end end 注记: 1。augment 是沿着找到的增广路径更新当前匹配。 2。pred是用于记录结点j的前继(predecessor),下页由于使用的DFS实现,就不必要这个参数了
0
0
2
2
从X中1开始搜索到Y中0,没 得到M-增广路径
X
Y
0
0
1
1
1
1
1
1
2
2
继续沿着Y中0对应的匹配X
中的0搜索,搜索到Y中的2,得
到一条M-增广路径:
X1-Y0-X0-Y2
2
2
更新匹配得到大小为2的匹 配
(图四)
2
2
从X2搜索最终得到一条M增广路径,后面的更新就不画 出来了,最终匹配大小就是3
寻找M-增广路算法描述
(图七)
1
3
b
这样就又找到了一条流量为1的路径. 注意从a到b是减1.现在总流量就是4了
/*u表示X部中当前访问的结点,y表示Y部分的大小*/ int path(int u,int y){
A[u]=1; for(int v=0;v<y;v++){
if(!G[u][v])continue; if(M[v]!=-1&&A[M[v]])continue; if(M[v]==-1||path(v,y)){
图论小组专题之
——网络流与匹配
08年08月08日
第一节 最大二部图基数匹配
Fra Baidu bibliotek
1.何为二部图
如果V(G)可以分到两个集合X,Y中,且X和Y内部没 有G的边.那么图G就是一个二部图(等价于图G是可二 顶点着色的)如右(图一)便是一个二部图.
2.二部图的性质
一个图是二部图当且仅当图G中没有奇环.比如说一个 三角形就不可能分成两个部分,并且每个部分内部没有 边,但一个正方形就可以.
2.判断一个匹配是不是最大匹配
一个匹配M是图G的最大匹配当且仅当图G中不存在M-增广路径. M-增广路径是一条边交替出现在M和不出现在M中的路径,且两个端 点没有被M中的边覆盖。如下(图二)红色的边代表匹配,灰色代表 不是匹配的边。若是一个图有M-增广路径,我们用灰色的边作为匹 配,就得到了一个更大的匹配
算法代码实现
/*G[x][y]表示二部图 M[Y]表示匹配,记录Y中每个顶点对应的匹配,若M[3]=5表示Y中的3和X中的5匹配,最开始M全部初始化为-1 A[X]用于记录DFS时X中顶点是否已经访问*/ #define X 10 #define Y 20 int G[X][Y],M[Y],A[X];
是M-增广路径
也是M-增广路径
(图二)
不是M-增广路径
二部图基数匹配算法
二部图的表示
由于二部图的每个部分内部没有边,这允许我们用 更少的空间来存储二部图的结构.若G[i][j]=1就表示 X部分的第i个顶点与Y部分的第j个顶点有一条边, 那么(图三)可表示为:
1 0 1 G[3][3] 1 1 0
0 0 1
算法思想
从X部分的每个顶点开始寻找一条M-增广路径,找到 增广路径之后沿着该路径更新得到一个更大的匹配
X
Y
0
0
1
1
2
2
(图三)
算法过程图解
X
Y
X
Y
X
Y
0
0
0
0
0
0
1
1
1
1
1
1
2
2
从X的顶点0开始,搜索到Y中 顶点0,获得条M-增广路径
X
Y
0
0
2
2
由此M-增广路径更新得到 0-0匹配
X
Y
如(图五),b,d,e,g,h构成一个最大的独立集
推荐题目:POJ 1466
e
3.任意无孤立顶点的图的边覆盖大小的最小值记为
ß’(G),那么ɑ’(G)+ ß’(G)=n.
如(图五),ae,bf,cg,fd,ch构成一个最小的边覆盖 推荐题目:无 本小节结束补充作业:POJ 2446
f gh
(图五)
相关文档
最新文档