二分图匹配模板题

2013-2014 ACM-ICPC, NEERC, Eastern Subregional Contest

 1 /*************************************************************************
 2     > File Name: a.cpp
 3     > Author: QWX
 4     > Mail:
 5     > Created Time: Fri 05 Oct 2018 06:37:54 AM PDT
 6  ************************************************************************/
 7
 8
 9 //{{{ #include
10 #include<iostream>
11 #include<cstdio>
12 #include<algorithm>
13 #include<vector>
14 #include<cmath>
15 #include<queue>
16 #include<map>
17 #include<set>
18 #include<string>
19 #include<cstring>
20 #include<complex>
21 #include<bits/stdc++.h>
22 #define mp make_pair
23 #define pb push_back
24 #define first fi
25 #define second se
26 #define pw(x) (1ll << (x))
27 #define sz(x) ((int)(x).size())
28 #define all(x) (x).begin(),(x).end()
29 #define rep(i,l,r) for(int i=(l);i<(r);i++)
30 #define per(i,r,l) for(int i=(r);i>=(l);i--)
31 #define FOR(i,l,r) for(int i=(l);i<=(r);i++)
32 #define eps 1e-9
33 #define pii pair<int,int>
34 #define vi vector<int>
35 #define PIE acos(-1)
36 #define cl(a,b) memset(a,b,sizeof(a))
37 #define fastio ios::sync_with_stdio(false);cin.tie(0);
38 #define lson l , mid , ls
39 #define rson mid + 1 , r , rs
40 #define ls (rt<<1)
41 #define rs (ls|1)
42 #define INF 0x3f3f3f3f
43 #define LINF 0x3f3f3f3f3f3f3f3f
44 #define ll long long
45 #define ull unsigned long long
46 #define dd(x) cout << #x << " = " << (x) << ","
47 #define de(x) cout << #x << " = " << (x) << "\n"
48 #define endl "\n"
49 using namespace std;
50 //}}}
51 int n,a,b;
52 const int N=507;
53 vi g[N],v0,v1;
54
55 namespace maxmatch
56 {
57     int link[N],vis[N];
58     bool dfs(int c){
59         for(auto t:g[c]){
60             if(vis[t])continue;vis[t]=1;
61             if(link[t]==-1||dfs(link[t]))return link[t]=c,1;
62         }
63         return 0;
64     }
65     int solve(int n,int m){
66         cl(link,-1);
67         int ret=0;
68         rep(i,0,n){
69             cl(vis,0);
70             ret+=dfs(i);
71         }
72         return ret;
73     }
74 }
75
76 int main()
77 {
78     cin>>a>>b>>n;
79     int s0=0,s1=0;
80     rep(i,0,n){
81         int t,op;
82         cin>>t>>op;
83         if(op==0)s0++,v0.pb(t);
84         else if(op==1)s1++,v1.pb(t);
85     }
86     rep(i,0,sz(v0))rep(j,0,sz(v1)){
87         if(v1[j]-v0[i]>=a||(v1[j]-v0[i]<=b&&v1[j]-v0[i]>=0))
88             g[i].pb(j);
89     }
90     int ans=maxmatch::solve(s0,s1);
91 //    de(ans);
92     if(s0==s1&&ans==s0){
93         puts("No reason");
94         rep(i,0,sz(v0))cout<<v0[maxmatch::link[i]]<<" "<<v1[i]<<endl;
95     }else puts("Liar");
96     return 0;
97 }

原文地址:https://www.cnblogs.com/klaycf/p/9751641.html

时间: 2024-10-31 15:19:30

二分图匹配模板题的相关文章

XidianOJ 1048 二分图匹配模板

题目描述 西电ACM实验室是一个很和谐的实验室,有n个男生和m个女生组成(m>0),尽管表面大家都全心全意地为了荣誉而战,然而经过亮亮的深入调查,我们已经知道了有一些人三心二意:每天只有99%的时间花费在切题上,而还有1%的时间在想着某位或某几位异性!作为FFF团西电分部的部长,亮亮显然不能容许这种朝三暮四的情况.但是西电ACM实验室又是一个很开明的实验室,于是亮亮决定尽可能的撮合实验室的队员! 那么问题来了,亮亮最多能撮合多少对呢? 输入 多组数据,每组数据首先是两个整数,n,m表示男女生的人

POJ 3041 Asteroids(二分图模板题)

Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K asteroids (1 <= K <= 10,000), which are conveniently located at the lattice points of the grid. Fortun

51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左边的点和没用过的右边的点连起来, 如果遇到一个点已经连过就试着把原来的拆掉 把现在这条线连起来看能不能多连上一条线. 总结来说就是试和拆,试的过程很简单,拆的过程由于使用递归写的,很复杂.很难讲清楚,只能看代码自己理会. 代码(有注释): #include <bits\stdc++.h> usin

匈牙利算法 二分图最大匹配题模板

[任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y之前没有被匹配,那么(x,y)就是一对合法的匹配,我们将匹配数加一, 否则我们试图给原来匹配的y和x'重新找一个匹配,如果x'匹配成功,那么(x,y)就可以新增为一对合法的匹配. 给x'寻找匹配的过程可以递归解决. [接口] int hungary(); 复杂度O(|E|*sqrt(|V|)) 输入

二分图相关题

HDU 1281 由于每行最多放一个,每列最多放一个(不能放置的位置不影响攻击,就是由于没注意这句话,把这题当做行列覆盖模型做了好久0.0) 所以把行列直接当做二分图X和Y集.能够放置的点的行列连边,求出的完备匹配就是第二个答案. 至于第一个答案求关键点,就枚举删除一条边是否能任然得到完备匹配,若不行,则是关键点. 我的代码c++会WA,不知道为什么.求教啊. #include<cstdio> #include<cstring> #include<algorithm>

Kuhn-Munkres算法。带权二分图匹配模板 (bin神小改版本)

/****************************************************** 二分图最佳匹配 (kuhn munkras 算法 O(m*m*n)). 邻接矩阵形式 . 返回最佳匹配值,传入二分图大小m,n 邻接矩阵 map ,表示权,m1,m2返回一个最佳匹配,为匹配顶点的match值为-1, 一定注意m<=n,否则循环无法终止,最小权匹配可将全职取相反数. 初始化: for(i=0;i<MAXN;i++) for(j=0;j<MAXN;j++) mat

二分图入门题

单向匹配 POJ 1274 POJ 2239 双向匹配 HDU 2063 HDU 1045 UVALive-6525 简单二分图匹配,把横向上连续的'.'处理为一个x值,纵向上连续的'.'处理成一个y值,以x,y值为顶点,坐标点为连接相应x,y值的边,二分图匹配即可.原理是图论上对匹配的定义.注意此时处理数组的大小,Vertex的值不再只是2 * n

hdu-1179 Ollivanders: Makers of Fine Wands since 382 BC.---二分图匹配模板

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1179 题目大意: 有n个人要去买魔杖,有m根魔杖(和哈利波特去买魔杖的时候一样,是由魔杖选人).接下来是m行,每行第一个数k是第i根魔杖可以选的人数,接着k个数表示这根魔杖选的人的编号.最后问老板最多能卖出多少根魔杖.这个赤裸裸的模版题,套下就OK了. 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll;

18.10.29 多模式串字符串匹配模板题~AC自动机

描述 给若干个模式串,以及若干个句子,判断每个句子里是否包含模式串. 句子和模式串都由小写字母组成 输入第一行是整数n,表示有n个模式串 ( n <= 1000)接下来n行每行一个模式串.每个模式串长度不超过20接下来一行是整数m,表示有m个句子 (m <= 1000)接下来m行,每行一个句子,每个句子长度不超过1000输出对每个句子,如果包含某个模式串,则输出 YES, 否则输出 NO 样例输入 3 abc def gh 2 abcd ak 样例输出 YES NO 来源 Xu Yewen 1