最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs

于是用到了dfs模板

寻找二分图最大匹配的算法是匈牙利算法

匈牙利算法的主要程序是寻找增广路

寻找增光路是过程是:从一个未经配对的点出发,历经未配边、匹配边、未配边、匹配边、未配边、...最终到达一个未配点的过程,只要把路径中的未配边和匹配边的“身份”对调,匹配就加一了。这就是一个寻找增广路的过程,通过不断寻找增广路,可以找到最大的匹配。

 #include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; struct Edge{
int to,nxt;
Edge(int to=,int nxt=):
to(to),nxt(nxt){}
}; const int maxn=,maxm=; Edge E[maxm<<];
int head[maxn],mat[maxn];
bool check[maxn];
int n,n_l,n_r,m,cnt=; bool dfs(int u){
for(int e=head[u];e;e=E[e].nxt){
int v=E[e].to;
if(!check[v]){
check[v]=;
if(mat[v]==-||dfs(mat[v])){
mat[v]=u;
mat[u]=v;
return ;
}
}
}
return ;
} void hungarian(){
int ans=;
memset(mat,-,sizeof mat);
for(int u=;u<=n_l;u++)
if(mat[u]==-){
memset(check,,sizeof check);
if(dfs(u)) ans++;
}
printf("%d\n",ans);
} inline void ad_e(int from=,int to=){
E[++cnt]=Edge(to,head[from]);
head[from]=cnt;
E[++cnt]=Edge(from,head[to]);
head[to]=cnt;
} void init(){
scanf("%d%d%d",&n_l,&n_r,&m);
for(int i=,ff,tt;i<m;i++){
scanf("%d%d",&ff,&tt);
if(tt>n_r) continue;
ad_e(ff,tt+n_l);
}
} int main(){
init();
hungarian();
return ;
}

最新文章

  1. wnmp环境搭建
  2. php设置浏览器响应时间
  3. stm32串口输出丢失第一个字符的问题及原因
  4. Webpack - CommonJs &amp; AMD 模块打包器
  5. JVM内存结构之二--新生代及新生代里的两个Survivor区(下一轮S0与S1交换角色,如此循环往复)、常见调优参数
  6. spring中@param和mybatis中@param使用差别
  7. 【转载】S2SH
  8. C# 中将多个空格替换成一个空格
  9. [设计模式2]--模板(Template)模式
  10. Hadoop2.0重启脚本
  11. awk内置变量 awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
  12. validate的使用
  13. informix建临时表索引
  14. TP5 路由使用
  15. AStar算法()
  16. 我们数学中常用的自然常数e代表什么?看完长知识了!
  17. Vector源码分析和实例应用
  18. C#设置IE代理
  19. Semaphore实现的生产者消费者程序
  20. 最少步数(bfs)

热门文章

  1. 22-8-filter
  2. 开启SSH 使用SSH登录工具连接虚拟机
  3. singleton 类模板限制类只能定义一个对象
  4. mysql组合查询
  5. ps去除元素的三种常用方法
  6. win10 快速访问存在 2345Downloads 删除解决方案
  7. R语言 判断
  8. 【基础】Hint控制语句执行
  9. php基本,输出 ,变量
  10. JavaWeb学习篇之----Tomcat中配置数字证书以及网络传输数据中的密码学知识