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