二分图相关问题

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

例题分析
Girls and Boys (SEERC, 2000)
TOJ 1047 / POJ 1466 题目大意:学校里有一些男生和女生,其中某些人 之间是romantically involved。现在要求找出一个最 romantically involved 大的集合,使得里面的任意两个人都没有involved
例题分析
Sample Input
43 34 13 23
Sample Input
33 13 12 23
Sample Output
2
Sample Output 1
最小覆盖?
二分图的最小路径覆盖
最小路径覆盖问题:用尽量少的不相交简单路 径覆盖有向无环图的所有顶点 将每个顶点分为两个,分别在X集合和Y集合 中,如果存在有向边(a,b),对应在二分图中有 (Xa,Yb) 最小路径数=节点数-最大匹配
例题
考虑n行m列棋盘,已知其禁止落子位置,求 能够放到棋盘上非攻击车的最大个数
分析
建图:对应棋盘的每一行,都有一个顶点属于 X集合,对应棋盘的每一列,相应也有一个顶 点属于Y集合,每个可以落子的位置对应一条 边,建立二分图 任意两个非攻击车不同行不同列,那么对应在 二分图中任意两条边不共享顶点,所以非攻击 车集合相当与一个匹配 非攻击车最大个数=最大匹配
匈牙利算法
交错路增广示例 (1-2-3-4-5-6-7-8)
1 2 4 6 3 5 7
8
匈牙利算法
定理:一个匹配为最大匹配当且仅当匹配中不 存在交错路
证明相当繁琐,具体参见组合数学
可以利用BFS或者DFS实现寻找交错路
匈牙利算法
匈牙利算法的实现还依赖于一个很重要的定理: 如果从一个点出发,没有找到增广路径,那么 无论再从别的点出发找到多少增广路径来改变 现在的匹配,从这个点出发都永远找不到增广 路径。 Why? AV0V1V2V3…….B 如果是V0或V2或…..的匹配的改变导致找到交 错路,那么改变的这点也存在于交错路中,那 么在改变之前就应该找到交错路
Sample Output 1 5
例题分析
首先,输入数据里面没有指明性别。必须先进 行染色,区分出X集和Y集。(输入数据保证 合法……) 容易看出,问题就是求二分图的独立集 根据“独立集=总点数-最大匹配数”即可求 解
例题分析
Air Raid (Asia, Dhaka, 02)
POJ 1422 有N个城市及M条道路,道路是有向的且道路不形 成环。现在要求派一些伞兵空降在某些城市,然后 这些伞兵可以沿着道路访问到其他城市,但是不能 有两个或两个以上伞兵访问同一个城市。 问要达到上述要求,至少需要多少伞兵? 城市数N<=120
例题
Sample Input
5 5 10 011 112 213 314 421 522 623 724 833 943
Sample Output 3
分析
建图:将机器A上的模式看作X集合,机器B上 的模式看作Y集合,每个任务对应一条边,两 点分别为在A,B上的模式,建立二分图 可以看出,所要求的机器最少重启次数就是二 分图的一个最小覆盖(涉及了所有的任务,至 少包含任务需要的其中一个模式)
分析
建图 行和列做点,方格做边? 因为当两个卫士中间有障碍物时,允许共线, 所以这样建图是错误的!!! 定义一段无法向左右扩展的连续非障碍物方格 为行连通块,一段无法向上下扩展的连续非障 碍物方格为列连通块
分析
我们把行连通块对应X集合,列连通块对应Y 集合,如果一个行连通块与一个列连通块有交 点且为空地,则对应在二分图中有一条边 显然卫士的集合对应二分图的一个匹配,任意 两个卫士不可能共同存在于一个行/列连通块 中,所以最多卫士数目=最大匹配数
最小路径覆盖
简单解释:
原图的路径覆盖和新图的匹配间有对应关系: 每条覆盖边都是匹配中的一条边,且只有路径的最 后一个点没有被匹配上。 路径要求不能相交,恰好对应于匹配中两匹配边不 能有公共端点。
最小路径覆盖
解释(续):
于是求最大匹配后,不能被匹配上的点,即是路径 的最后一个点。有多少个不能被匹配的点,就有多 少条路径存在。 路径数=原点数-匹配边数。因此我们使匹配边数 最大,即是使路径数最小。
匈牙利ቤተ መጻሕፍቲ ባይዱ法
匈牙利算法只需要以每个节点为起点找一次增 广路即可求得最大匹配,寻找增广路的复杂度 为O(E),总的复杂度为O(VE)
DFS实现 int find(int k) { for (每个与k相邻的点j) if (cover[j] == FALSE) { q = link[j]; link[j] = k; cover[j] = TRUE; if (q == -1 || find(q) == 1) return 1; link[j] = q; } return 0; } work() { link[ ]数组初始化为-1 for (i = 0 ; i < m ; i++) { cover[ ]数组初始化为FALSE; find(i); } }
匈牙利算法
简要说明:find函数用于判断从k点开始是否能 够找到一条交错路。对于每个可以与k匹配的 顶点j,假如它未被匹配,交错路就已经找到; 假如j已与某顶点x匹配,那么只需调用find(x) 来求证x是否可以与其它顶点匹配,如果返回 true的话,仍可以使j与k匹配;这就是一次 DFS。每次DFS时,要标记访问到的顶点 (cover[j]=true),以防死循环和重复计算。
例题
考虑n行m列棋盘,已知其某些位置禁止覆盖, 求能够放到棋盘上1*2骨牌的最大个数
分析
建图:将棋盘黑白染色,相邻的格子染成不同 的颜色,染色后格子分为黑白两类,对应二分 图模型中的X和Y集合,相邻的格子间在二分 图中有一条边 每张骨牌肯定覆盖两个相邻的格子,因此每张 骨牌对应一条边,所求骨牌数=最大匹配
二分图相关问题
二分图相关问题
二分图最大匹配 二分图最小覆盖 二分图最大独立集 二分图最小路径覆盖 二分图最优匹配 稳定婚姻问题
二分图定义及判定
定义:二分图中,顶点可以分为两个集合X和 Y,每一条边的两个顶点都分别位于X和Y集合 中 判定:利用BFS或者DFS进行黑白染色,共享 一边的两点异色,检查是否存在矛盾 图G为二分图的充要条件是图中不含奇环
例题
Muddy Fields (USACO, January 05, Gold)
POJ 2226 题目大意:在一块R*C的地面上,有一些格子是泥 泞的,现在要用一些宽为1的木板把泥地盖住,并 1 且不能盖住好地。木板可以重叠。问最少需要多少 木板? R,C<=50
例题
Sample Input
44 *.*. .*** ***. ..*.
二分图最大匹配
定义:匹配是二分图中边的集合,且集合中的 任意两条边没有公共点,包含边数最多的匹配 就是最大匹配
匈牙利算法
概念:交错路
对于一个匹配M,如果能找到一条奇数长度的路, 使得路的第一、三、五……边不属于M,而第二、 四、六……边属于M,那么这条路叫做交错路。 交错路可以“增广”,即通过适当修改得到更大的 匹配。
X X S X X
X X X X
X代表攻击范围,S代表骑 士
分析
对棋盘染色,设方格的坐标为(x,y),x和y同奇 偶的方格对应X集合,不同奇偶的对应Y集合。 由于骑士沿着“日”字形路线攻击,所以每个 攻击肯定是处于X集合和Y集合之间,而不可 能在两个集合内部。 显然,转化后变为求二分图的最大独立集
最小覆盖
证明(续) 所取的点覆盖了所有边。假设存在一条边未被 覆盖,则该边右端点被标记了,左端点未标记。 如果这不是一条匹配边,那么相当于找到了交 错路,如果着是一条匹配边,那么右端点只能 通过其匹配的左端点到达。 最小(why?)
例题
Machine Schedule
TOJ 1119 / POJ 1325 题目大意:有两台机器A,B及N个任务。每台机器有 M M种不同的模式,对每个任务i给定a[i]和b[i],表示 i a[i] b[i] 如果该任务在A上执行,需要设置模式为a[i],如果 在B上执行,需要模式为b[i]。任务可以以任意顺序 被执行。但每台机器转换一次模式就要重启一次。 要求合理分配任务并合理安排顺序,使得机器重启 次数最少。 M,N <= 100, 任务数K <= 1000
放K个球至少需要几根柱子? 每个球看做是一个节点,对于球a,b(a<b), 如果a+b是完全平方数,那么有一条a指向b的 边,由于a总是小于b,显然所建图无环。 每根柱子相当于一条路径,而且每个球只能位 于一根柱子上,所以保证了路径不会相交,至 此,问题转化为最小路径覆盖
分析
能够放的球的数目是随着柱子数单调递增的。 根据答案的单调性,我们可以通过二分答案解, 将每次二分出的答案和N做比较,最后得出答 案
KM算法
定理:如果一个相等子图中包含完备匹配,那 么这个匹配就是最优匹配 证明:由于在算法过程一直保持顶标的可行性, 所以任意一个匹配的权值和肯定小于等于所有 结点的顶标之和,则相等子图中的完备匹配肯 定是最优匹配
二分图最小覆盖
图的覆盖:寻找一个点集,使得图中每一条边 至少有一点在该点集中
二分图的最小覆盖=二分图的最大匹配
最小覆盖
最小覆盖
如何构造一组最小覆盖? 求得最大匹配M后,图中已经不存在交错路。从右边 未匹配的点开始,以寻找交错路的方式扩展节点,并 标记路过的节点。取右边未标记的节点,左边标记的 节点,则构成一组最小覆盖。 证明 所取节点数=|M| .右边未匹配的点肯定被标记了,左 边未匹配的点不可能被标记(否则找到了交错路), 一条匹配边的左端点被标记,那么右端点也肯定被标 记,所以所取节点恰覆盖一条匹配边
例题分析
Hanoi Tower Troubles Again! (OIBH Contest)
ZOJ 1239 题目大意:给定柱子数N,按编号从小到大放球, 要求:如果该球不在最底数,则该球和它下面一个 球的编号之和必须为完全平方数。 问对于给定的N,最多能放多少球上去。 N<=50
例题分析
分析
铺放方法
1.2. .333 444. ..2.
Sample Output 4
分析
最小覆盖是覆盖所有的边,因此泥地对应边 建图方式类似于皇家卫士,也是利用行连通块 和列连通块做点,单位泥地对应二分图中的边 要求放最少的板覆盖全部的泥地,转化为求最 小覆盖
二分图最大独立集
图的独立集:寻找一个点集,其中任意两点在 图中无对应边 一般图的最大独立集是NP完全问题 二分图的最大独立集=图的点数-最大匹配数
例题分析
Sample Input 1
7 0: (3) 4 5 6 1: (2) 4 6 2: (0) 3: (0) 4: (2) 0 1 5: (1) 0 6: (2) 0 1
Sample Input 2 3 0: (2) 1 2 1: (1) 0 2: (1) 0 Sample Output 2 2
二分图的最大独立集
黑色点即为一个最大独立集
简单解释
可以这样理解,在总的点集中,去掉最少的点, 使得剩下的点相互之间没有边。用最少的点去 覆盖所有的边,也就是最小覆盖。 二分图的最大独立集=图的点数-最大匹配数
例题
骑士问题 一个n*n的棋盘上,有一些 单位小方格不能放置骑士。 求出最多可以放置几个相 互不攻击的骑士
例题
皇家卫士(CEOI 2002) 为了保卫一个N*M(N,M<=200)的矩形城堡, 国王打算安排尽可能多的卫士,城堡地形比较 复杂,有许多陷阱和障碍物.每个卫士占领一 个单位的空地,当两个卫士共线且中间无障碍 物阻挡时,他们会互相攻击,已知地图,求最 多安排多少个不相互攻击的卫士?
例题
x x x o x o x x x g x o x g o x
二分图最优匹配
又称带权最大匹配。 二分图的每条边带有权值。求一个匹配使得匹 配边上的权值和最大。 一般X和Y集合顶点个数相同,最优匹配也是 一个完备匹配,即每个顶点都被匹配。如果个 数不相等,可以通过补点加0边实现转化。 最小?
KM算法
基本概念:可行顶标和相等子图 可行顶标:L是一个关于结点的函数,L(x)是 顶点x对应的顶标值。可行顶标对于图中的每 条边(x,y)都有L(x)+L(y)>=w(x,y) 相等子图:只包含L(x)+L(y)=w(x,y)的边的子 图
相关文档
最新文档