随笔分类 -  二分匹配问题

摘要:与二分图不同,一般图的最大匹配用的是带花树开花算法。当然,本质都是寻找增广路。下面的模板是来自这个博客的http://fanhq666.blog.163.com/blog/static/8194342620120304463580/ural1099(模板)#include <cstdio>#include <algorithm>#include <vector>using namespace std;const int NMax=230;int Next[NMax];int spouse[NMax];int belong[NMax];int findb(in 阅读全文
posted @ 2013-03-08 22:57 枕边梦 阅读(2466) 评论(0) 推荐(0)
摘要:题意:题目的意思很清晰,对于一个有向图,将N个点划分成最少的集合个数,同时满足俩个条件:1) 任意俩点,若互相可达,则必须在同一个集合中2)属于同一个集合的任意俩个点对(u,v),至少存在一条路径,使得v对于u 可达 或者 u 对于v 可达分析:对于上述俩个条件,为了简化问题,需要进行缩点,属于同一个强连通分量的点,缩成同一个点,重新构图,可以用tarjan 算法;这样,第一个条件就一定满足了,接着只剩下第二个条件了,其实,任意俩点,只要在同一条有向路径上,则可以属于一个集合,,,那么问题就转化为用最小的有向路径去覆盖所有的点(最小路径覆盖数==点数-最大匹配数)View Code #incl 阅读全文
posted @ 2012-05-19 20:49 枕边梦 阅读(228) 评论(0) 推荐(0)
摘要:pku2899 Jamie's Contact Groups题意:在通讯录中有N个人,每个人能可能属于多个group,现要将这些人分组m组,设各组中的最大人数为max,求出该最小的最大值分析:二分group的最大值,+二分图多重匹配View Code #include<iostream>#include<algorithm>#include<string>using namespace std;const int N = 1000+10;const int M = 500+10;int n,m;int map[N][M],vlink[M],link[ 阅读全文
posted @ 2012-04-15 15:51 枕边梦 阅读(1708) 评论(0) 推荐(0)
摘要:很明显的一个二分图多重匹配,一开始用网络流直接建图,悲剧的TLE了之后,看了网上解释,缩点,确实大大简化了问题,也就可以AC了,600+ms一开始是这样建图的,先有虚拟源点s,汇点t,从s向每一个人连一条容量为1的边,每一个人向他适合的每一个planet连一条容量为1边,再从每一个planet连一条容量为w[i](该planet的容量)的边,很明显,判断最大流是否等于n即可。n为100000,而m只有10其实,在这道题目里面,人是无差别的,有区别是他们各自的选择,而总共只有10个planet,也就是所有的选择数也就(1<<10)种,所有选择都相同的人完全是等价的!!!可是,没想到还 阅读全文
posted @ 2012-04-15 14:34 枕边梦 阅读(1299) 评论(0) 推荐(0)
摘要:最近又重新过了一遍二分匹配,发现了一些之前理解上的误区,这几天的纠结还是很值得的hdu1281 棋盘游戏//分别以行和列为单位,那么确定的和行和列唯一确定一个格子//行向列连边,求最多的可放置的格子,也就是求最大匹配//求重要点数,删除已匹配的边,判断是否存在最大匹配View Code #include<iostream>#include<algorithm>using namespace std;const int N = 101;int n,m,my[N],mx[N];bool vis[N],mat[N][N];//分别以行和列为单位,那么确定的和行和列唯一确定一个 阅读全文
posted @ 2012-04-02 10:32 枕边梦 阅读(196) 评论(0) 推荐(0)
摘要:题意:抽象出模型: 用1*2的木板覆盖矩阵中的‘#’,(木板要覆盖的只能是‘#’),问最多能用几个木板覆盖分析:很典型的二分匹配问题,将矩阵中的点分成俩种,下标i+j为奇数和偶数俩种,即把矩阵当成一个黑白棋盘,那么,一个木板只能覆盖一个黑色和一个白色格子,将黑色格子(并且是‘#’的格子)跟相邻的白色(并且是‘#’)的格子连一条边,则变成了一个求最大匹配的问题了点数太多,可以将棋盘上的点hash一下View Code #include<iostream>#include<algorithm>#include<vector>using namespace std 阅读全文
posted @ 2012-03-31 21:31 枕边梦 阅读(658) 评论(0) 推荐(0)
摘要:感觉这俩个博客真的解释的太好了,今天有点恍然大悟的感觉http://cuitianyi.com/blog/%E6%B1%82%E6%9C%80%E5%A4%A7%E6%9D%83%E4%BA%8C%E5%88%86%E5%8C%B9%E9%85%8D%E7%9A%84km%E7%AE%97%E6%B3%95/http://www.byvoid.com/blog/match-km/最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大。解决这个问题可以用KM算法。理解KM算法需要首先理解“可行顶标”的概念。可行顶标是指关于二分图两边的每个点的一个值lx[i]或ly[ 阅读全文
posted @ 2011-09-04 09:26 枕边梦 阅读(460) 评论(0) 推荐(0)
摘要:模板题来的,构完图之后就是直接的模板了,可惜对于这个算法还是了解的不够深…………若求得的是最大匹配,则将权值为正,若为最小匹配,则将权值该为相反数此模板默认所有数组默认下标从1 开始,复杂度O(n^3)mat 表示邻接矩阵,nx,ny表示二分的大小lx,ly表示为顶标,fx[i],fy[i]标记十分访问过该点mx[i],my[i] 表示匹配先贴模板:KM算法模板#include <iostream>using namespace std;const int MAXN = 110;const int INF = 0x7FFFFFFF;int nx, ny, w[MAXN][MAXN] 阅读全文
posted @ 2011-09-03 23:29 枕边梦 阅读(255) 评论(0) 推荐(0)
摘要:题意:给定N张幻灯片的maxx,minx,maxy,miny,和N个点的位置,表示幻灯片的编号,编号写在幻灯片上,问幻灯片与编号形成的最大匹配能否确定唯一的匹配,输出已确定的唯一匹配;分析:若编号与幻灯片满足 minx<x<maxx, miny<y<maxy,则形成一个可能的匹配,求出最大匹配(肯定是完美匹配的)之后,再依次判定该匹配边是否为必须边判定方法:先将该匹配边删除,判定从该点出发是否存在增广路径,若存在,则不是必须边,反之,为必须边;#include<iostream>using namespace std;bool mat[26][26],vis 阅读全文
posted @ 2011-09-02 09:36 枕边梦 阅读(307) 评论(2) 推荐(0)
摘要:题意:修理公司的工人可以给城市中不同的工厂修理工具。给出各个工厂路径的邻接矩阵,和总任务数,还有每个工厂的工具修理需要的开始时间结束时间。问最少派出多少个工人可以完成所有任务?分析:跟pku2060几乎是一样的题目,只不过得用一次floyd算法任意俩点之间的最短路径View Code #include<iostream>using namespace std;int inf = 100000000;struct Task{ int q; int s; int t;}; Task tt[205];char mat[205][205];char vstd[205... 阅读全文
posted @ 2011-08-30 16:17 枕边梦 阅读(225) 评论(0) 推荐(0)
摘要:题意:给一个有向无环图,求最小的路径数覆盖每个顶点至少一次分析:很明显的一道最小路径覆盖,可是稍微有些不同的是:“You should notice that the roads of two different robots may contain some same point. ”标准的最小路径覆盖是不允许有相交的路径,所以将所以有可以相连的间接的路径直接相连起来,即在求最大匹配之前,用一次floyd 算法即可#include<iostream>using namespace std;bool map[501][501],vis[501];int match[501],n;i 阅读全文
posted @ 2011-08-30 14:42 枕边梦 阅读(342) 评论(0) 推荐(0)
摘要:题意:出租车可以不停地做任务,任务是在一定时间内,把车从一个地方开到另一个地方。给出各项任务的具体时间和地点,问最少需要多少辆出租车来做任务?分析:首先,因为是在做二分匹配,所以肯定知道是用二分匹配做啦,如果是偶然遇到,真的不敢保证我能想到用二分匹配做;既然用二分匹配做,那么首先就是构图啦,怎样建立匹配关系呢?就是在任务之间建立关系,把任何可能衔接在一起的任务当做一个匹配,那么很明显,接下来就是求这个图的一个最小路径覆盖了,求最小的路径覆盖所有的点,即完成所有的任务;最小路径覆盖==点的个数-最大匹配下面在计算时间的时候,将所有时间都转换成分了,这样少了很多判断了#include<ios 阅读全文
posted @ 2011-08-29 23:06 枕边梦 阅读(352) 评论(0) 推荐(0)
摘要:pku 3014题意:有个r行c列的棋盘,上面的某些方格中有怪物,现在你能做的一次操作是将其中一行或一列的怪物都消灭掉,问将所有怪物都消灭掉的最少次数是多少? pku 1325题意: A B两台机器分别有n,m(0…n-1, 0…m-1)种工作模式,初始时都处于0模式。而且如果机器要改变模式,必须重启(重启就是回到0模式)。现在有k个任务,每个任务都可以被A或B的某些模式完成。问最少需要重启多少次? 分析:倆道题目我们都可以这样理解:第一个题目: 在棋盘上的每一个怪物,都可选择被该行消灭还是被该列消灭,这是行与列就是一种匹配;而第二个题目:对与每一个任务,有俩种选择,可以选择被A的某种模式或者 阅读全文
posted @ 2011-08-25 14:39 枕边梦 阅读(266) 评论(0) 推荐(0)
摘要:题意:R行c列的草地中有些泥坑,FJ想用一些木板将泥坑盖住,但是又不想盖住了草地,已知木板可以任意长。问怎样用最少的木板将所有泥坑盖住?分析:题意是很好理解,可是要想到二分匹配来做就难了,要想到那种构图的方法更是难上加难呀,太佩服了,这种构图方法反正我是怎么想也想不到的。因为不能盖住草地,所以在某一行有可能出现多个横着的木板,所以不能只用一个点来表示一行,而是有多个点。同样列不能只用一个点来表示一列。将连续的点当成一个点建图,一条边仍然表示的是一个有泥地的方格看题目中给的示例:*.*..******...*.转换成下面来个这样的矩阵:1 0 2 00 3 3 34 4 4 00 0 5 0-- 阅读全文
posted @ 2011-08-25 14:30 枕边梦 阅读(284) 评论(0) 推荐(0)
摘要:快顶不住了,理解了多少,先写出来再说;题意:军队里面要展开实战演练,已经将n个士兵分成了两队,红队和蓝队。指挥官认为,如果两个属于不同阵营中的士兵是好朋友,那么演练就会有感情因素的干扰。所以要选出最少的人,以排除感情因素的干扰。问要选出多少人?选哪些人? 分析: 就题目而已,很明显是一道求最小覆盖点集的题目,又最小覆盖点数==最大匹配数,所以,单求出队人数的话,就是一道完完全全的求二分最大匹配的题目,可是,要怎么求出最小覆盖点集呢?而且还要按字典序输出?问题就在这里了,在求出最大匹配数的基础,从第一个点开始枚举,若去掉这个点,此时,最小覆盖数减少(即从该点匹配的点为起点,找不到增广路径),则该 阅读全文
posted @ 2011-08-24 01:52 枕边梦 阅读(195) 评论(0) 推荐(0)
摘要:都是求最大二分匹配的题目,只不过比模板题稍微灵活了一点,需要将题目进行一定的转化pku2446【题目大意】: r行c列的棋盘,现在要用1x2的骨牌来覆盖整个棋盘。骨牌不能重叠,且棋盘上有的方格不能放骨牌。问能不能将棋盘完全覆盖【算法分析】:关键是建立二分的模型,用1x2的骨牌来覆盖棋盘其实隐含了一个性质,一张骨牌覆盖相邻的方格。就是说一次我们选择了两个方格,这两个方格相邻。把棋盘画成黑白棋盘,就转换成了二分图。每个方格可以和周围几个方格连线,寻找到最大的匹配数。比较最大匹配数*2是否和之前的空白方格数相等。另外可以发现一个剪枝,空白方格如果是奇数个,就肯定不能覆盖。pku2446#includ 阅读全文
posted @ 2011-08-23 02:06 枕边梦 阅读(278) 评论(0) 推荐(0)
摘要:二分图:二分图是这样一个图,它的顶点可以分类两个集合X和Y,所有的边关联的两个顶点恰好一个属于集合X,另一个属于集合Y。二分图匹配:给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是一个匹配。最大匹配:图中包含边数最多的匹配称为图的最大匹配。完美匹配:如果所有点都在匹配边上,则称这个最大匹配是完美匹配。二分图匹配基本概念:未盖点设VI是G的一个顶点,如果VI不与任意一条属于匹配M的边相关联,就称VI是一个未盖点。交错轨设P是图G的一条轨,如果P的任意两条相邻的边一定是一条属于M而另一条不属于M,就称P是交错轨。可增广轨(增广路)两个端点都是未盖点的交错轨 阅读全文
posted @ 2011-08-23 00:26 枕边梦 阅读(321) 评论(0) 推荐(0)
摘要:关于二分匹配,一开始总下不了手,应该说,不知道该从何下手,课件上就很直接的就引入匈牙利算法,看了好久之后还是一样一头雾水,这让我情何以堪啊!!不过,跟这算法走一遍之后,感觉有些许的理解这个算法了,问题的关键在与寻找增广路径,当图中不存在增广路径时,表明已经是最大匹配了这里面的四道题目,有三道是完全的模板题,pku2239需要稍微转换一下,题目中说,在course和每周的12个教室进行匹配,不发生冲突,其实也就是总共300个courses和7*12个教室进行匹配,只需要在输入的时候稍微的修改一下,a 表示course,q days 在p class上课,即表示在mat[a][12*(p-1)+q 阅读全文
posted @ 2011-08-22 21:15 枕边梦 阅读(268) 评论(0) 推荐(0)