二分图

一般图最大匹配——带花树

不打扰是莪最后的温柔 提交于 2019-12-24 02:49:17
所谓花,就是如下图所示的一个奇环: 本文中粗边代表现在的匹配边,细边代表该点的前驱(后文会讲解前驱是什么,现在只需要知道每个点和它的前驱在原图中一定是有边的)。 如图所示,一朵包含 \(2k+1\) 个点的花一定至多包含 \(k\) 条匹配边,于是总会剩下一个未匹配的点,上图中即为 \(1\) 号点。 那么我们可以发现,如果有另外一个点想要与花中的某个点 \(v\) 匹配,那么有两种情况:1、 \(v\) 是未匹配的点(即1号点),那么直接与 \(v\) 匹配即可。2、 \(v\) 是已经匹配的点,这时只要将花中的匹配状况修改,使得 \(v\) 变成未匹配的那个点即可。 综上所述,只要花中的点没有向外匹配,我们总是可以使得外部的一个点和花中任意一个点匹配,因此花的性质和点其实很相似。我们将花缩成一个点来处理,就可以解决出现奇环的问题。以上思想就是带花树算法的核心。 ==================总之分割一下好了================== 带花树算法的过程其实和 \(bfs\) 版本的匈牙利是很相似的,都是找出一个交错树,交错树可能长这样(注意每个蓝色点可能有多个橙色儿子,但是每个橙色点只能有一个蓝色儿子): 其中1号点就是我们尝试增广的节点,在这里我们给每一个节点一个 \(type\) 值,若该点不在交错树中,它的 \(type\) 值为 \(0\) ,否则为 \

二分图最大匹配

a 夏天 提交于 2019-12-24 01:13:51
HDU 1150: http://acm.hdu.edu.cn/showproblem.php?pid=1150   最小覆盖点 == 最大匹配数( 选取最少的点数,使这些点和所有的边都有关联——把所有的边的覆盖 ) 两台机器,有n和m个工作模式,起始工作模式都为0,现在有k件工作,第i件工作可分别在两个机器上用各自的模式工作,但换模式要重启,问重启的最小次数。 写的时候因为是找二分最大匹配的题目时找到写的,想到了二分上去,也知道是求最小覆盖点 == 最大匹配数,但不是很能理解,先把代码写了再说。 写的时候注意起始模式是0,所以换模式时把0的排除再外。(因为这个原因错了很多次) 一:邻接阵做法 代码 #include<iostream>using namespace std;int n,m,k;int map[105][105]; //记录X,Y对应点可否连接int vis[105]; //每次找增广路时对Y中点是否访问int dir[105]; //Y中点匹配的X中点的位置int find(int a){ int i; for(i=0;i<m;i++) { if(map[a][i]==1 && vis[i] == 0) { vis[i] = 1; if(dir[i] == -1 || find(dir[i])) { dir[i] = a; return 1; } } }

二分图最大匹配总结

☆樱花仙子☆ 提交于 2019-12-21 03:39:27
一.结论: 1.最大匹配。 2.最小点覆盖:用最少的点去覆盖掉所有的边。 最小点覆盖 = 最大匹配 。 3.最小边覆盖:用最少的边区覆盖掉所有的点,单独一个点可看作一条边。 最小边覆盖 = 结点数 - 最大匹配 。 4.最大独立集:选出尽可能多的点使得他们之间没有关系(没有边相连)。 最大独立集 = 结点数 - 最大匹配 。 5.最大团:选出尽可能多的点使得他们构成一个完全图。 最大团 = 补图的最大独立集 。 6.最小路径覆盖(有向图):选出最少的路径,使得每个点恰好在一条路径上,单独一个点可看作一条边。 最小路径覆盖 = 结点数 - 最大匹配 。 二.证明: 1.最小点覆盖 = 最大匹配: König定理,不会。 2.最小边覆盖(ans) = 结点数(n) - 最大匹配(cnt) 证明:我们假设图中不存在边,那么每个点都要一条边去覆盖,所以总共要n条覆盖边。之后我们考虑原图中的边,利用Hungary()算法求出最大匹配数为cnt,这就表明了:有cnt个点,可以与其他点共用一条覆盖边,于是就可以除去cnt条覆盖边。所以最小边覆盖:ans = n - cnt 。 3.最大独立集(ans) = 结点数(n) - 最大匹配(cnt) 建图:如果u和v有关系,或者说有冲突,那么就在u和v之间连上边。 证明:最大独立集,即在在图中 删去尽可能少的点, 使得剩下的点互相独立,即没有边的存在

网络流专题

血红的双手。 提交于 2019-12-21 01:04:35
仔细思考了一下,发现自己还有许多弱项,网络流也是其中之一,而且只会写板子,需要补一补。 还有10天就GDOI了,要抓紧啊…… 注意:以下某些题没有写代码,只是口胡后看了题解发现差不多,不保证完全正确。 本专题的题单来自 https://www.cnblogs.com/xht37/p/10457051.html ,Orz神仙 二分图 洛谷P1402 酒店之王 把每个人拆成两个点放在中间,左边房子右边菜,跑最大流即可。 洛谷U64949 棋盘覆盖 黑白染色之后发现只能黑和白匹配,于是就是个二分图了,搞出最大匹配即可。 套路:黑白染色之后有可能会成为二分图。 洛谷U64970 車的放置 把行和列作为点,格子作为边,如果可以放就把对应的行列连起来,然后跑最大匹配。 这样的匹配显然满足所有车都不同行不同列。 套路:行列作为点,格子作为边。 洛谷P1129 [ZJOI2007]矩阵游戏 注意到一个性质:无论怎么换,同行的黑点仍然同行,同列的黑点仍然同列。 所以每行/列最多有一个黑点在对角线上。 那么和上一题一样的建图方法就可以做了。 洛谷P1963 [NOI2009]变换序列 显然在 \(D(i,T_i)\) 确定的情况下能与 \(i\) 匹配的 \(T_i\) 是常数级别的。 那么连一下二分图就可以得到一组解了。 用匈牙利算法,从后往前做,就可以字典序最小了。 UVA1194 Machine

[16' KDD]Compressing Graphs and Indexes with Recursive Graph Bisection

℡╲_俬逩灬. 提交于 2019-12-18 04:00:09
Compressing Graphs and Indexes with Recursive Graph Bisection [SIGKDD' 16] Authors Abstract Intro. & Motiv. Algorithmic Aspect 定义图重排问题的优化目标 统一建模与新的优化目标 之前的一些近似算法 Compression-friendly Graph Reordering 算法框架:递归二分图 图二分方案 Experiments 数据集 压缩效果 重排后的邻接矩阵情况 Conclusion & Inspiration Authors 本文发表于2016年 SIGKDD 上,第一作者是来自卡耐基梅隆大学(CMU)的Lax Dhulipala。其与来自FaceBook的多人合作完成了本工作。 原文链接 Abstract 图重排 ( Graph reordering ),顾名思义就是把图的节点序号重新排列。图重排的意义是:通过重新排列,增强 图表示的结构局部性 。而 图表示的结构局部性 含义即邻接结构上相似的顶点,在线性排列映射得到的序号能够相近。 例如 ,原有节点集{1,2,3,4,5},其中1和5全部都连接了2和3,图重排之后,原来编号为1和5的这两个点就会更加邻近。 很容易可以想到的是,图重排造成的图线性表示结构上结构局部性的提升,会进一步带来提升图和

匈牙利算法

会有一股神秘感。 提交于 2019-12-13 10:37:29
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 概述 在二分图中寻找最大匹配数的算法(如对二分图不熟悉,可以看下笔者的另一篇文章 二分图/二部图检测(动图&代码实现) ),即对一侧的每一个尚未匹配的顶点,不断寻找可以增广的交替路 交替路: 匹配边和非匹配边交替出现 增广路径: 从一侧的非匹配点终止于另一个非匹配点 匈牙利算法 思路 从左侧的一个非匹配点出发 从右向左的边,永远走匹配边 终止于另一个非匹配点,则有增广路径,最大匹配数加1 补充:左侧和右侧只是一种说法,等价于一侧和另一侧 二分图寻找最大匹配数 下图是一个二分图,将会通过给这个图寻找最大匹配数,来描述匈牙利算法寻找增广交替路的思路 补充:匹配后的点置为红色,匹配边也置为红色 从顶点0出发,到达顶点4,此时顶点0和顶点4都是非匹配点,则找到一条增广交替路,最大匹配数为1 从顶点1出发,从 右->左的边只走匹配边 ,所以走1->4->0,此时来到顶点0,还可以走到顶点6,顶点6又是一个非匹配点,则找到一条增广的交替路,将该交替路中的 匹配路变为非匹配路,非匹配路变为匹配路 ,并将顶点1和顶点6置为匹配点 此时的最大匹配数为2 从顶点2出发,依次走过:2->6->0->4->1->5,找到一条新的增广交替路,再进行一次变换,并将顶点2和顶点3置为匹配点 此时的最大匹配数为3 至此,所有的顶点都匹配到了

二分图扩展概念

纵饮孤独 提交于 2019-12-10 11:59:27
最小顶点覆盖:在二分图中寻找一个尽量小的点集,使图中每一条边至少有一个点在该点集中。   最小顶点覆盖 == 最大匹配。   反证法证明:假设当前存在一条两个端点都不在最小顶点覆盖点集中,那么这么光芒四射的边定可以增大最大匹配边集,与最大匹配矛盾,所以得证。 最小路径覆盖:在二分图中寻找一个尽量小的边集,使图中每一个点都是该边集中某条边的端点。   最小路径覆盖 == 顶点数 - 最大匹配。   证明:因为一条边最多可以包含两个顶点,所以我们选边的时候让这样的边尽量多,也就是说最大匹配的边集数目咯。剩下的点就只能一个边连上一个点到集合里啦。 最大独立集:在N个点中选出来一个最大点集,使这个点集中的任意两点之间都没有边。   最大独立集 == 顶点数 - 最大匹配。   证明:因为去掉最大匹配两端的顶点去掉以后,剩下的点肯定是独立集。我们再从每个匹配里面挑选出来一个点加入到独立集中,也是不会破坏原有独立集的独立性的。 来源: https://www.cnblogs.com/DeNeRATe/p/12015636.html

Test 1023 T1&T2

筅森魡賤 提交于 2019-12-09 18:30:10
T1 popust (贪心 TimeLimit: 1000MS Memory Limit: 32768KB ​ 米尔科饿了如熊,偶然发现当地一家餐馆。餐厅提供 \(n\) 种餐,有一个有趣的定价政策:每种餐有两个指定的价格, \(A_i\) 和 \(B_i\) 。米尔科支付第一种餐只能用价格 \(A\) ,后面的则只能支付 \(B\) 价格。他知道一种餐只能订一次,但不知道自己要订几种,于是他想知道从 \(1\) 种到 \(N\) 种的最少的费用(其实他不在意到底吃哪一种)。请你帮他想一下。 输入 : ​ 输入的第一行包含正整数 \(N(2≤N≤500000)\) ,餐厅提供的餐的种类数。 以下 \(N\) 行包含两个正整数, \(A_i\) 和 \(B_i\) \((1 ≤ Ai, Bi ≤ 1 000 000 000)\) ,表示第 \(i\) 种餐的两个价格。 输出 : \(N\) 行,第 \(i\) 行表示恰好订 \(i\) 种餐的最低价格 input 3 10 5 9 3 10 5 output 9 13 18 input 2 100 1 1 100 output 1 2 input 5 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000

2019.11.30 二分图学习

自闭症网瘾萝莉.ら 提交于 2019-12-06 05:21:14
一.学习二分图 1.了解并掌握二分图的判定方法: 双栈排序(NOIP2008提高) 关押罪犯(NOIP2010提高) 分组(BSOJ) 2.了解并掌握二分图的最大匹配求法: 匈牙利算法模板 信与信封问题(BSOJ) 连续攻击游戏(SCOI2010) 3.了解、掌握并证明二分图最小覆盖的求法: Machine Schedule Muddy Fields(POJ2226) 4.了解、掌握二分图的最大独立集: Air Raid(POJ1422) 来源: https://www.cnblogs.com/Neat-Foxes/p/11963796.html

km算法入门

≡放荡痞女 提交于 2019-12-05 00:29:21
km算法入门 https://www.cnblogs.com/logosG/p/logos.html 本文知识均由笔者自学,文章有错误之处请不吝指出。 笔者刷数模题的时候有一道题考到了“二分图最大权分配”,需要用到KM算法,但是书上对KM算法的介绍又臭又长,更何况有些同学“匈牙利算法”也没学过(由匈牙利数学家Edmonds提出),自然难以理解所谓的KM算法。本文旨在用通俗易懂的语言,向读者介绍匈牙利算法和KM算法。 一、匈牙利算法 匈牙利算法用于解决什么问题? 匈牙利算法用于解决二分图的 最大匹配 问题。 什么是二分图?我们不妨来考虑这样一个问题,在一家公司里,有员工A,B,C,有三种工作a,b,c,如果员工和工作之间有线相连,则代表员工能胜任这份工作。 如图所示,员工A能胜任a,c工作,员工B能胜任a,b,c工作,而员工C只能胜任c工作。 上图就是所谓的“二分图”(请忽略图中箭头),简单的说,上图可划分为两个集合{员工},{工作},两个集合之间的元素可以相连,同一个集合内的元素不能相连。 下面请解决这样一个问题:请给出一个方案,让尽可能多的员工有 不同 的工作做。“匈牙利算法”的出现就是为了解决这个问题。 下面给出这个问题的解决方案:(读者看到这里可能会想,解决这个问题不是很简单吗?A→a,B→b,C→c不就好了?请注意:任何算法的给出都是为了 规整化 一个问题的解决步骤