
二分匹配
文章平均质量分 72
bubbleoooooo
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
poj2195 Going Home(二分图的最小权匹配)
//二分图的最小权匹配 //将权值以及顶标初始化为负,最后取反就好 #include #include #include #include using namespace std; #define clr(a) memset(a,0,sizeof(a)); const int N=300; const int INF=0x3fffffff; int G[204][204]; struct KM{原创 2015-07-26 20:10:37 · 427 阅读 · 0 评论 -
hdu1151 air Raid(最小路径覆盖)
//hdu 1151 //访问小镇最多需要几个士兵,每个士兵的路无交点,实际上就是求有向无环图的最小路径覆盖 //最小路径覆盖(不要求二分图):在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联 //最小路径覆盖 = 顶点数 - 最大匹配数 //对于有向无环图,首先拆点,建成二分图再进行求解 #include #include #include using name原创 2015-07-24 10:36:27 · 352 阅读 · 0 评论 -
hdu 2444 The Accomodation of Students (判断二分图+最大匹配)
//hdu 2444(判断二分图+最大匹配) //判断二分图用bfs进行染色,如果染色过程中出现矛盾,就不是二分图。0-1-0-1-0 //二分图的充要条件,无向图中,顶点数大于2,且所有回路长度都是偶数。 #include #include #include using namespace std; const int N=400; int n,m,k; int g[N][N]; struct原创 2015-07-24 11:20:17 · 366 阅读 · 0 评论 -
hdu 2819 Swap 二分图的最大匹配
//hdu 2819 //直接按照给定的矩阵建图 //判断匹配是否能达到n //然后选择排序确定交换顺序。 #include #include #include using namespace::std; const int INF=0x7fffffff; const int N=110; int g[N][N]; int L[N],R[N]; struct Hungary{ int us原创 2015-07-25 09:16:08 · 436 阅读 · 0 评论 -
hdu1045 Fire Net(二分图最大匹配)
//hdu 1045 二分最大匹配 //以行和列为点,可以放的连边,中间有墙的看做不同的行或列。 //求二分图的最大匹配。同一行同一列只能放一个。即连某个点的边只能有一条。 //行和行,列和列之间互不影响。 #include #include #include using namespace::std; const int N=10; char map[N][N]; int g[N][N]; in原创 2015-07-24 20:40:59 · 1183 阅读 · 0 评论 -
hdu 3118 Arbiter(枚举构造二分图)
//hdu3118 枚举 //实际上是在图中最少减去多少边令图上没有奇数环,实际上就是二分图 //利用二进制枚举,0、1表示两个集合。 //对于每种染色状态,枚举边,冲突则删掉。 #include #include #include using namespace::std; const int INF=0x7fffffff; const int N=20,M=500; int g[N][N];原创 2015-07-24 21:09:30 · 466 阅读 · 0 评论 -
hdu3729 I'm Telling the Truth(二分图最大匹配)
//hdu 3729 //对于区间而言,只能选择固定的人数,且每个排名只能有一个人,很显然左边人数,右边区间进行二分匹配。 //对于字典序最大的匹配,我们枚举人的时候,从n->1,这样保证尽可能选后面。 #include #include #include using namespace::std; const int INF=0x7fffffff; const int N=100,M=10001原创 2015-07-24 21:47:35 · 847 阅读 · 0 评论 -
二分匹配Hopcroft-Karp算法
#include #include #include using namespace std; const int N = 110; const int INF=0x7fffffff; int bmap[N][N];//每次记得清空 //对于两边各50000个点,200000条边的二分图最大匹配可以在1s内出解,效果很好:) struct HK{//用HK算法求解二分最大匹配问题(时间复杂度为sq原创 2015-07-25 11:08:13 · 675 阅读 · 0 评论 -
hdu 5352MZL's City(15多校第五场1010)
//15多校第五场 //hdu 5352 //对于每次选点,可能会有重叠 //每次选点是独立的,待选择点也是独立的 //所以可以把所有的选择情况看成一张二分图 //对每一个X点,最多匹配K个Y点 //匈牙利算法即可。 #include #include #include #include #include #include #include using namespace std; const原创 2015-08-05 20:49:00 · 458 阅读 · 0 评论 -
hdu 1150 Machine Schedule(最小点覆盖)
//hdu 1150 //把job看成是一条边,选某个点,就表示某个点要重启一次,实际上,某个点最多需要选择一次就够了。 //因为如果重启两次的话,第二次的任务肯定在第一次的时候可以完成。 //最小点覆盖=最大匹配 #include #include #include using namespace std; const int N=110; int n,m,k; int g[110][110];原创 2015-07-24 09:57:32 · 406 阅读 · 0 评论 -
hdu 1281 棋盘游戏
//hdu 1281 二分匹配 //选重要边的时候,暴力枚举每一条边,如果去掉这条边后最大匹配数减小,则为重要边。 //因为没写#include RE了一小时,已哭晕。 #include #include #include using namespace::std; const int N = 110; int g[N][N]; struct Hungary{ int used[N原创 2015-07-23 11:22:09 · 386 阅读 · 0 评论 -
hdu1068 Girls and Boys(二分匹配)
//hdu 1068 二分匹配。 //我们要求的是一个二分图的最大点独立集。 //对于二分图而言,最大点独立集 = 总点数 - 最大匹配数(边最小覆盖) //集合内部的二分匹配,可以通过拆点进行扩展。 //对于一个无法分清哪些点属于A,哪些点属于B的二分图。 //可以考虑拆点,实际上就是把原来的二分图作了一个对称, //这两个二分图之间是相互独立的。 //对于这个新的二分图,我们求出的最大匹配数是原创 2015-07-23 10:00:27 · 425 阅读 · 0 评论 -
hdu 3681The King’s Problem(强连通分量+最小路径覆盖)
//hdu 3861 //给定一张有向图,划分成几个部分, //对于u可以到v,v可以到u的点必须在同一部分 //同一部分中u可以到v或者v可以到u //我们首先将图的强连通分量写出来,缩点, //对于当前的有向无环图求最小路径覆盖 //为什么是最小路径覆盖呢? //因为每一个部分的任两个点都是单向可达的,实际上每一部分都是一个路径, //因为若分叉,由于方向性,必然分叉与分叉直接互不可达,不符合原创 2015-07-26 14:12:45 · 480 阅读 · 0 评论 -
二分匹配小结
对于二分匹配问题有三个常用的结论: 1.二分图的最大匹配数等于最小覆盖数 2.二分图的独立数等于顶点数减去最大匹配数 3.最小路径覆盖 = 顶点数 - 最大匹配数(有向图要先拆点建二分图) 设最大匹配为M,匹配数为|M| 首先对于我们已经匹配的二分图 匹配|M|一定是有这样的性质的: 对于任意的属于|M|只存在或,这两者是不可能同时存在的。 因为如果同时存在,那么我们必原创 2015-07-26 14:55:12 · 455 阅读 · 0 评论 -
hdu 3517 Adopt or not(二分图最大独立集关键点)
//hdu3517 //最大独立集 //此题求独立集中的关键点 //对于某点,如果未匹配(cx[i]==-1,cy[i]==-1),肯定在关键点中 //对于匹配中的点,若此点不是匹配中的关键点,那么删除此点最大匹配数不会改变, //|V|减小,独立集变小,不能删。 //那么此点为独立集中的关键点 //(如果此点是二分图中的关键点,那么删除此点,最大匹配数减小,那么|V|-|M|增大,可以删。) #原创 2015-07-25 20:04:05 · 612 阅读 · 0 评论 -
hdu 3722Card Game(KM匹配求环)
//求图中环的最大权 //直接拆点,求二分图的最大权匹配。 #include #include #include using namespace std; #define clr(a) memset(a,0,sizeof(a)); const int N=300; const int INF=0x3fffffff; char dic[204][1024]; int score[204][204];原创 2015-07-26 19:41:50 · 411 阅读 · 0 评论 -
hdu 2853Assignment (二分图的最大权匹配)
//hdu2853 //二分图的最大权匹配,图中有一些边,在等权值的条件下有优先选择权。 //因为是选n个进行匹配,我们将每条边的权值扩大(n+1)倍,这样每条边相对大小是一样的 //对于有优先选择权的边,我们将这些边的权值加一,这样权值大的优先,但是加1的结果不会大于n //最后除以n就可以把这部分忽略掉。答案对n取模得出的就是我们选择有优先选择权边的数量。 #include #include原创 2015-07-27 09:16:44 · 591 阅读 · 0 评论 -
hdu 3718Similarity(二分图最大权匹配)
//hdu 3718 //两个字符串的最大相似度 //容易看出,字符与字符只能一一对应 //如果字符i与字符j对应,那么权值就为此类对应存在的数量。 #include #include #include #include #include using namespace std; #define clr(a) memset(a,0,sizeof(a)) const int N=500; const原创 2015-07-27 10:53:48 · 459 阅读 · 0 评论 -
奇怪的不知道对不对的二分图最大匹配算法=_=
//二分图最大匹配不知道什么算法=_= //时间复杂度未知,但是比匈牙利算法快,貌似比hk算法也快=_= //过了hdu1045,hdu1068两个二分图匹配板题,其他题还没试 //仅适用于求二分最大匹配值,以及任意一种输出方案,字典序神马的未知 bool vis[N],found; int line[N],l[N];//序号1~n void dfs(int u,int m){ f原创 2015-08-26 17:12:38 · 478 阅读 · 0 评论 -
CF571C-CNF 2
//CF571C-CNF 2 //遇上了一个奇怪的二分匹配算法 //x集合是变量,y集合是析取式 //因为一个变量最多有两条边,如果变量的两条边都是同一性质,都是本身,或都是反变量,变量的值可直接得出 //剩下的就是只有一条边,或两条性质不同的边,性质不同只能选一个,所以就变成了二分图的最大匹配问题 //二分图匹配的匈牙利算法和Hopcroft-Krap算法都会T //看到一个歪果仁的匹配算法,不原创 2015-08-26 16:41:59 · 680 阅读 · 0 评论 -
匈牙利算法模板+KM算法模板
匈牙利算法模板 #include #include const int maxn=1010; const int maxm=20010; const int MAX=10001; const int INF=1000000000; int line[maxn]; int n,m,cnt,slack; int head[maxn]; bool used[maxn];//Y集合中点的状态 struc原创 2015-03-29 21:56:56 · 1093 阅读 · 0 评论