二分图匹配
来源:互联网 发布:2016年网络诈骗追回率 编辑:程序博客网 时间:2024/06/06 01:32
最近做了一套匹配的题,然后就想简单的写一下 关于二分图匹配的问题。
首先二分图匹配是给N个人 分配P个任务,每个人对应一个任务,问能够匹配到的个数,而当个数最多是,这就是我们说的二分图的最大匹配,当每个人都有任务时,就是我们说的完美匹配。
那么这种问题应该如何求解呢?
(当然,我们可以增加一个源点和汇点变成最大流问题)
当然我们也可以通过另外一种方法
现在我们假设我们通过dfs 不断寻找增广路来实现二分图的最大匹配
具体思想就是,比如说,我们有小①和小②是一对,这时候小③过来要和小①在一起,那么这时候有两种办法 一种是让小③走开,另一种就是让小②去找小④,小②已经和小①配对了,我们去看看有没有小④,如果有小④,那么就可以配成两对,如果没有,就只能配成一对。当遇到冲突时,如果我能找到一种方法,让之前的配对的每个人都找到另外的配对,那么这样就会增加一个配对。 也就是所说的通过走交替路找到一条增广路。
模板如下:
vector<int>G[maxn];int match[maxn];bool used[maxn];void add_edge(int u,int v){ G[u].push_back(v); G[v].push_back(u);}bool dfs(int v){ used[v]=true; for(int i=0;i<G[v].size();i++) { int u=G[v][i]; int w=match[u]; if(w<0||!used[w]&&dfs(w))//就是dfs寻找一个增广路 { match[v]=u; match[u]=v; return true; } } return false;}int bipartite_matching(){ int res=0; memset(match,-1,sizeof(match)); for(int v=0;v<20;v++) { if(match[v]<0) { memset(used,0,sizeof(used)); if(dfs(v)) { res++; } } } return res;}
阅读全文
0 0
- 二分图图匹配
- 二分图匹配
- 二分图匹配
- 二分图匹配
- 二分图匹配
- 正则二分图匹配
- 二分图匹配
- 二分图匹配总结
- 二分图最大匹配
- 二分图最大匹配 。
- hdu2119二分图匹配
- 二分图匹配
- 二分图匹配
- 二分图匹配算法
- poj3020-二分图匹配
- 二分图匹配
- 二分图最大匹配
- 二分图最大匹配
- 如何收集和整理论文(面向CS专业)
- 集合框架——collection
- cmd里javac与java命令的讲解
- BZOJ1015 [JSOI2008]星球大战starwar
- spark基本概念与架构设计
- 二分图匹配
- LDA的使用记录--gensim库
- 51nod 1806 wangyurzee的树[purfer][容斥]
- 跟着《SpringInAction》学Spring——入门篇
- linux .bz2文件 解压缩命令的简单使用
- 输出学生信息
- 傻傻分不清的那些“报告”
- 浅谈数据仓库和大数据
- 第十八课(二)、 C指针(深入)