二分匹配
_pkm_
love coding
展开
-
HDU I'm Telling the Truth (二分图最大匹配+字典序最大路径输出(好题))
关键在于建图,把 每个学生和它的可能的名次之间连上边,然后最大匹配,匹配时逆序进行(保证字典序的最大)#include#include#include#include#include#include#include#include#include#include#include#include#define lson (rt<<1),L,M#define rson (原创 2015-08-24 20:01:47 · 850 阅读 · 0 评论 -
HDU149850 years, 50 colors(行列匹配+最小点覆盖)
题意:给出一个n*n的矩阵,里面的数字代表气球的颜色,你每次可以一行或者一列里的相同的某一颜色气球,并把它们全部打破,你一共有k次机会,问最后不能被某一位学生在k次操作里打破的气球,按字典序升序输出,没有的话输出-1 思路:我们反过来想,能被学生在K次里打破的话,那么这些气球的分布行列数必然不大于K,我们就以某一色气球的 X,Y建立二分图 ,X,Y对应二分图的左右两边,我们肯定是要选择最少点来覆盖原创 2015-08-15 18:53:16 · 669 阅读 · 0 评论 -
HDU2389 Rain on your Parade(二分图匹配 ,HK算法 )
匈牙利算法果断超时,只有用HC模板测试一下#include#include#include#include#include#include#include#include#include#include#include#include#define lson (rt<<1),L,M#define rson (rt<<1|1),M+1,R#define M ((L原创 2015-08-24 20:48:40 · 1228 阅读 · 0 评论 -
HDU 1507 Uncle Tom's Inherited Land*(行列匹配||棋盘覆盖||黑白染色||奇偶匹配(1X2的矩形覆盖))
题意:n*m的棋盘里,有几个点是不可以放的,要求在剩下的可以放的点上放置1X2的矩形,问最多可以放多少个 思路:观察发现,如果把矩阵按坐标和的奇偶分为A,B两个集合,每一个点可以到达周围的四个点,正好是1X2的覆盖,也就是分为A,B集合后的最大匹配。#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#in原创 2015-08-18 19:06:51 · 661 阅读 · 0 评论 -
HDU1528Card Game Cheater(最大匹配)
题意:给出 Adam和Eva二人的牌,游戏规则是,每个人轮流每次选择出一张牌,牌的数字大的赢,如果,数字一样按牌的花色H>S>D>C决定谁赢。 思路:按照牌的大小关系,建立二分图的A,B两个集合,EVA大于Adam的牌,就连上边。#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>原创 2015-08-18 20:17:29 · 915 阅读 · 0 评论 -
HDU 2063 过山车( 最大匹配 )
题意:中文 思路:最大匹配#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<string>#include<cstring>#include<stack>#include<queue>#include<vector>#in原创 2015-08-18 20:51:59 · 645 阅读 · 0 评论 -
HDU1845Jimmy’s Assignment(无向图,最大匹配)
题意:就是求最大匹配#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<string>#include<cstring>#include<stack>#include<queue>#include<vector>#includ原创 2015-08-18 20:35:13 · 1166 阅读 · 0 评论 -
HDU2119Matrix(最小点集覆盖)
题意: n*m的矩阵由0,1组成,现在每次操作可以选择一行或者一列,把这一行或者一列的1都变成0,问最少操作几次,可以把1去完。 思路:把矩阵按X,Y坐标分为二分图的A,B俩集合,1的点,可以由其的横坐标向纵坐标连边,最后就是求建立的图的最小点集覆盖(因为你选择一个横坐标的话,肯定是想能最多的把这个横坐标对应的所有的纵坐标都选择到,画个图就很清晰了),最小点集覆盖等于最大匹配#include<cs原创 2015-08-18 21:08:26 · 620 阅读 · 0 评论 -
HDU 2444 (二分图判定+最大匹配)
题意:略 思路:能否把人分为俩个组,然后求最大匹配#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<string>#include<cstring>#include<stack>#include<queue>#include原创 2015-08-18 21:31:21 · 509 阅读 · 0 评论 -
HDU2768Cat vs. Dog(最大独立集)
题意:C只猫。D只狗,V为观众的投票,格式CX,DY支持CX留下,让DY出局。问怎么抉择能最多留下观众,输出最多的观众数 思路:关键还是建图,就是把题目的某种关系建成二分图,这里我们选择人物的对立关系,建立边,对立的人分为二个集合,他们之间连边,#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#incl原创 2015-08-19 17:44:56 · 772 阅读 · 0 评论 -
HDU 3360National Treasures(行列匹配+最大匹配)
题意:在一个n*m的图中每个点有宝贝要雇佣警卫来保护,-1是已经有的了,其他的整数,代表这个位置周围至少有的警卫布局,参考题目的图片。#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<string>#include<cstring>原创 2015-08-22 14:24:24 · 751 阅读 · 0 评论 -
二分图学习小结
二分图的性质:在无向图G中,至少要有两个点。如果存在回路,那么回路必为偶数边的回路。。 匹配: 在图论中,一个匹配是一个边的集合,其中任意两条边都没有公共顶点。 最大匹配: 一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配 最大匹配数:最大匹配的匹配边的数目 完美匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么原创 2015-08-30 10:21:23 · 932 阅读 · 0 评论 -
HIHO #1121 : 二分图一•二分图判定
题目链接图可能是非连通的,计算每一个子图是不是都是满足二分图的性质#include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define LL long long#define pb push_back#define gcd __gcd#define For(i,j,k) for(int原创 2016-08-17 19:34:12 · 247 阅读 · 0 评论 -
HIHO #1122 : 二分图二•二分图最大匹配之匈牙利算法
题目链接以前学习过,复习一下#include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define LL long long#define pb push_back#define gcd __gcd#define For(i,j,k) for(int i=(j);i<k;i++)#de原创 2016-08-17 19:35:11 · 266 阅读 · 0 评论 -
HDU1281 棋盘游戏(坐标平面 ,行列匹配+求关键点)
题意:略; 思路:把坐标X看做二分图的左边,Y看做右边,结合二分图的最大匹配,左右顶点形成的最大匹配边,就是不同行不同列。求关键点,就一次枚举删掉某一个边后是否会使匹配变小#include<iostream>#include<cstdlib>#include<cmath>#include<algorithm>#include<cstring>#include<cstdio>#inclu原创 2015-08-15 18:01:40 · 456 阅读 · 0 评论 -
HDU1179Ollivanders: Makers of Fine Wands since 382 BC.(最大匹配)
关键建图#include#include#include#include#include#include#include#include#include#define cl(a,b) memset(a,b,sizeof(a));#define LL long long#define P pair#define X first#define Y second#defin原创 2015-08-15 16:23:43 · 460 阅读 · 0 评论 -
HDU 1151 Air Raid( 最小路径覆盖)
#include#include#include#include#include#include#include#include#include#define cl(a,b) memset(a,b,sizeof(a));#define LL long long#define P pair#define X first#define Y second#define pb原创 2015-08-15 15:26:00 · 401 阅读 · 0 评论 -
HDU 1045 Fire Net(行列匹配变形+缩点建图)
题意:n*n的棋盘上放置房子,同一方同一列不能有两个,除非他们之间被墙隔开,这样的话。 把原始图分别按行和列缩点 建图:横竖分区。先看每一列,同一列相连的空地同时看成一个点,显然这样的区域不能够同时放两个点。这些点作为二分图的X部。同理在对所有的 行用相同的方法缩点,作为Y部。 #include<cstdio>#include<iostream>#include<algorithm>#i原创 2015-08-22 18:10:30 · 703 阅读 · 0 评论 -
HDU1350 Taxi Cab Scheme (最小路径覆盖)
题意:m个顾客的乘车信息,表示几点上车,要从一个坐标到达另一个坐标,花费的时间是两点的曼哈顿距离,两次换乘至少间隔1分钟(再加上坐标的二者的坐标的距离),求最少的司机数目 思路:建图,以输入的信息为编号,如果时间满足的话,就连边。#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>原创 2015-08-22 20:23:03 · 503 阅读 · 0 评论 -
HDU 2819 Swap (行列匹配+输出解)
题意:能否使对角线上全是1 ,这个简单直接按行列匹配,难在路径的输出,我们知道X,Y左右匹配完了之后,不一定是1–1,2–2,3–3……这样的匹配。可能是1–3,2–1,3–2,我们要把他们交换成前一种的匹配形式,也就是路径的答案,再有矩阵的一些关于秩的性质,行变换和列变换是等价的。#include<cstdio>#include<iostream>#include<algorithm>#i原创 2015-08-24 22:16:59 · 879 阅读 · 0 评论 -
HDU3118Arbiter (二分图的本质(好题)+二进制枚举)
题意:删除给出的图中的最少的边,让图无奇数边的环 二分图的定义:至少含有2个点,如果有环,环必须是偶数的边。 二分图如果分成两个部分,比如X,Y两部分,我们知道两部分之间是有边相连的,但是同一部分之间的点是没有边相连的。 所以,结合以上的知识,我们枚举,把图的点分为2个部分,只要把同一部分的点之间的边删掉,那么最后剩下的图就是二分图,就是满足题意的图,枚举过程记录最小值#include<cs原创 2015-08-24 16:21:53 · 1003 阅读 · 0 评论 -
HDU 3605 Escape(多重匹配之多对多的匹配)
题意:N个人要要到M个星球上去,告诉每个人可以去哪些星球,以及每个 星球可以住的人数,问所有的人时候都可以安排完 这题和 HDU1669差不多,HDU1669是一对多的匹配,这是多对多的匹配,一对多的匹配是大家的limit都是一样的,多对多的匹配是大家的limit不都一样,每个人有自己的limit,所以开个数组记录每个人的limit#include<cstdio>#include<iostre原创 2015-08-25 14:22:06 · 3793 阅读 · 0 评论 -
HDU1669 Jamie's Contact Groups (二分+二分图的多重匹配+一对多的匹配)
多重匹配:一对多的二分图的多重匹配。二分图的多重匹配算法的实现类似于匈牙利算法,对于集合X中的元素xi,找到一个与其相连的元素yi后,检查匈牙利算法的两个条件是否成立,若yi未被匹配,则将xi,yi匹配。否则,如果与yi匹配的元素已经达到上限,那么在所有与yi匹配的元素中选择一个元素,检查是否能找到一条增广路径,如果能,则让出位置,让xi与yi匹配。match[i][j]表示X集合中的Xi点与原创 2015-08-25 12:35:04 · 4442 阅读 · 0 评论 -
HDU 1083Courses(最大匹配)
#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<string>#include<cstring>#include<stack>#include<queue>#include<vector>#include<cstdlib>原创 2015-08-25 18:23:00 · 548 阅读 · 0 评论 -
HDU 2548Kindergarten (最大独立集 + 建图细节)
把不认识的人建立关系,求最大独立集。#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<string>#include<cstring>#include<stack>#include<queue>#include<vector原创 2015-08-25 22:09:26 · 700 阅读 · 0 评论 -
HDU4160 Dolls(最大匹配)
简单题#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<string>#include<cstring>#include<stack>#include<queue>#include<vector>#include<cstd原创 2015-08-25 22:40:52 · 576 阅读 · 0 评论 -
HDU4185Oil Skimming(行列匹配||棋盘匹配||黑白染色||1X2矩形覆盖)
题意:找出最多的形如“##”横着竖着都可以,明显的1X2矩形覆盖,直接按坐标和的奇偶来分为二分图。#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<string>#include<cstring>#include<stack>原创 2015-08-26 10:32:10 · 1039 阅读 · 0 评论 -
HDU3861 (强连通缩点+二分匹配最小路径覆盖)
题意:把城市至少分成几个块,规则有三 1. A能B,B能到A,那么A,B一定要在一起。 2. 一个城市只能属于一个块。 3. 在一个块里的城市,任意2点之间必须有路径。 对于规则1,就是说强连通的必须在一起,所以用Tarjan进行缩点,然后,规则2,3就是求DAG最小路径覆盖。(最小路径覆盖=顶点数-最大匹配)#include<cstdio>#include<iostream>#in原创 2015-08-27 18:51:55 · 715 阅读 · 0 评论 -
HDU1068 (最大独立集)
HDU1068 最大独立集 题意:按一男一女配对,最后求不能配对的,即最大独立集,等于顶点数-最大匹配#include<iostream>#include<cstdlib>#include<cmath>#include<algorithm>#include<cstring>#include<cstdio>#include<queue>#include<set>#include<st原创 2015-08-15 10:45:32 · 490 阅读 · 0 评论 -
HDU1150 (最小点集覆盖)
HDU1150 最小点集覆盖 题意:有A,B两台机器,每个机器有一系列的工作模式,在某一次开启使用中只能处于其中的某一个模式,这个模式只有重启机器才能改变,一个工作i,(i,x,y)表示它可以在A机器的X模式,或者B机器的Y模式上工作,现在问至少要重启机器几次 以工作(x,y)为边建图,那么就是选择最少的几个点可以覆盖所有的边,就是最小点集覆盖,他等于二分图的最大匹配数,同时注意开始机器处于状态原创 2015-08-15 10:44:26 · 468 阅读 · 0 评论 -
HIHO #1127 : 二分图三·二分图最小点覆盖和最大独立集
题目链接#include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define LL long long#define pb push_back#define gcd __gcd#define For(i,j,k) for(int i=(j);i<k;i++)#define lowbi原创 2016-08-17 19:45:25 · 298 阅读 · 0 评论