题目描述

给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数

题目地址


匈牙利算法

  • 本质上是对于每个点进行dfs,并在递归的同时不断找出新的增广路.
  • 注意点:
  1. 需要使用vis数组并在每次dfs前清空,防止死循环.
  2. 模板里不需要加双向边.
  3. vis并不是增广成功才能设置,失败不设置一定会爆栈的.
  4. 在dfs的过程中累加ans会导致增广路全部被计入.

Dinic算法

  • 和其他题一样,对面的点集需要序号平移n个单位.

匈牙利算法

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN=10010,MAXM=1000010;
struct Edge{int from,to,nxt;
}e[MAXM];
int head[MAXN],edgeCnt=1;
void addEdge(int u,int v){e[++edgeCnt].from=u;e[edgeCnt].to=v;e[edgeCnt].nxt=head[u];head[u]=edgeCnt;
}
int vis[MAXN],match[MAXN];
int dfs(int x){for(int i=head[x];i;i=e[i].nxt){int nowV=e[i].to;if(vis[nowV])continue;vis[nowV]=1;if(!match[nowV]||dfs(match[nowV])){match[nowV]=x;return 1;}}return 0;
}
int main(){int n,m,e;scanf("%d%d%d",&n,&m,&e);for(int i=1;i<=e;i++){int u,v;scanf("%d%d",&u,&v);if(v>m||u>n)continue;addEdge(u,v);}int ans=0;for(int i=1;i<=n;i++){memset(vis,0,sizeof(vis));if(dfs(i))ans++;}printf("%d\n",ans);return 0;
}

Dinic算法

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int MAXN=1000010,MAXM=1000010;
int s,t;
struct Edge{int from,to,w,nxt;
}e[MAXM];
int head[MAXN],edgeCnt=1;
void addEdge(int u,int v,int w){e[++edgeCnt].from=u;e[edgeCnt].to=v;e[edgeCnt].w=w;e[edgeCnt].nxt=head[u];head[u]=edgeCnt;
}
int d[MAXN];
bool bfs(){memset(d,0,sizeof(d));queue<int> q;d[s]=1;q.push(s);while(!q.empty()){int nowV=q.front();q.pop();for(int i=head[nowV];i;i=e[i].nxt){int nowNode=e[i].to;if(!d[nowNode]&&e[i].w){d[nowNode]=d[nowV]+1;if(nowNode==t)return 1;q.push(nowNode);}}}return 0;
}
int Dinic(int x,int flow){if(x==t)return flow;int rest=flow;for(int i=head[x];i&&rest;i=e[i].nxt){int nowV=e[i].to;if(d[nowV]==d[x]+1&&e[i].w){int k=Dinic(nowV,min(rest,e[i].w));if(!k)d[nowV]=0;e[i].w-=k,e[i^1].w+=k;rest-=k;}}return flow-rest;
}
const int INF=2e9;
int main(){int n,m,e;scanf("%d%d%d",&n,&m,&e);s=n+m+1,t=n+m+2;int u,v;for(int i=1;i<=n;i++){addEdge(s,i,1);addEdge(i,s,0);}for(int i=1;i<=e;i++){int u,v;scanf("%d%d",&u,&v);if(v>m||u>n)continue;addEdge(u,v+n,1);addEdge(v+n,u,0);//}for(int i=1;i<=m;i++){addEdge(i+n,t,1);addEdge(t,i+n,0);}int ans=0;while(bfs()){ans+=Dinic(s,2e9);}cout<<ans<<endl;return 0;
}

P3386 【模板】二分图匹配相关推荐

  1. 算法模板——二分图匹配

    实现功能为二分图匹配 原理:匈牙利算法,核心思想--匹配上了就配,没直接匹配上也要通过前面的腾出位置让这个匹配上(详见:趣写算法系列之--匈牙利算法) 本程序以Codevs2776为例 详见Codev ...

  2. 【洛谷P3386】【模板】二分图匹配【网络流】

    题目大意: 题目链接:https://www.luogu.org/problemnew/show/P3386 求一个二分图的最大匹配. 思路: 二分图匹配的模板.可以用匈牙利做. 听说这道题卡Dini ...

  3. 洛谷 P3386 【模板】二分图匹配

    洛谷 P3386 [模板]二分图匹配 题目 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行 ...

  4. P3386 【模板】二分图匹配(匈牙利模板)

    P3386 [模板]二分图匹配 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u ...

  5. P3386 【模板】二分图匹配(匈牙利算法)

    展开 题目背景 二分图 感谢@一扶苏一 提供的hack数据 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入格式 第一行,n,m,e 第二至e+1行,每行两个正整数u ...

  6. Dinic二分图匹配 || Luogu P3386

    题面:[模板]二分图匹配 思路:Dinic实现二分图匹配,要建一个超级源点(S)和超级汇点(T),分别定为N+M+1和N+M+2 然后S去和N中的数建正边和反边,正边权值为1,反边权值为0:M中的数去 ...

  7. 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)...

    题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...

  8. 洛谷P3386:网络流之二分图匹配,最大流算法

    二分图:我的理解是,对图中的点集,可分为两个集合U和V,使得两个集合之间存在通路,且集合内部不存在通路.如上图. 匹配:两两不含公共端点的边集合M 最大匹配:边数最多的匹配 完美匹配:最大匹配的匹配数 ...

  9. 算法补完计划(五) 二分图匹配

    二分图 如果一张图能被分为两部分,两部分之间存在边相连,而单个部分内的结点无边相连,那这张图叫做二分图 判断二分图 我们给图进行染色,从一个点开始染成红色,相邻点染蓝色,最后能全部染完,并且任意相邻点 ...

  10. 模板 - 二分图(包含全套常用定理性质)

    整理的算法模板合集: ACM模板 目录 染色法判断二分图 增广路的性质 一些二分图的概念和定理 增广路定理 二分图最大匹配 二分图完美匹配 霍尔定理(hall 定理) 霍尔定理推论 匈牙利算法 二分图 ...

最新文章

  1. 【计算理论】不可判定性 ( 停机问题 | 图灵机语言是否空集问题 | 图灵机是否等价问题 | 是否存在自动机接受图灵机语言问题 | 莱斯定理 Rice‘s Theorem )
  2. Py之argparse:Python库之argparse(命令行解析)简介、安装、使用方法之详细攻略
  3. 计算机组成原理手动在线模式,实验四计算机组成原理 运算器手动实验
  4. TensorFlow, PyTorch, Caffe2的比较
  5. iview中嵌套使用tabs注意事项
  6. matlab 功率谱分析函数psd用法
  7. 如何基于tomcat构建web站点
  8. WebLogic11g-创建域(Domain)及基本配置
  9. FireBug 调试JS
  10. 使用LogParser分析IIS网站日志
  11. 手动实现一个迷你版的AOP(实战增强版)
  12. 第3章 别碰白块(《C和C++游戏趣味编程》配套教学视频)
  13. [转载] python程序所需的图片通过base64编码成字符串放在代码中
  14. html中rowspan设置动态值_大众标准里机器人程序中P值的设置存在那里?
  15. 快速开发jQuery插件的10大技巧(转)
  16. MATLAB画函数图像
  17. 【大咖有约】58同城孙玄:58同城从MongoDB到MySQL迁移之路
  18. exchange2010安装
  19. 服务器虚拟机迁移的过程和步骤是什么,虚拟机迁移的详细步骤(新手如何做好虚拟机迁移)...
  20. java基础学习总结——方法的重载(overload)

热门文章

  1. Onestage Grounding
  2. MSRA显著性检测数据集
  3. html table 合并单元格 分页,Word表格跨页,合并单元格后,希望跨页的每一页都显示合并单元格的内容(有图)...
  4. ducter运维平台_专访运维管理开源平台负责人刁文波:Ducter能帮你!
  5. Spring入门-1-基本配置和IOC、DI
  6. Ansible Ad—hoc 模式常用模块
  7. 线性代数 --- 三种计算矩阵的行列式的方法之二 莱布尼兹展开法(个人笔记扫描版)
  8. docker网络模式与资源控制
  9. 高德地图API - 根据经纬度获取周边建筑地标
  10. [CF796E Round#408 Div.2]Exam Cheating——[计数DP]