P3386 【模板】二分图匹配
题目描述
给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数
题目地址
匈牙利算法
- 本质上是对于每个点进行dfs,并在递归的同时不断找出新的增广路.
- 注意点:
- 需要使用vis数组并在每次dfs前清空,防止死循环.
- 模板里不需要加双向边.
- vis并不是增广成功才能设置,失败不设置一定会爆栈的.
- 在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 【模板】二分图匹配相关推荐
- 算法模板——二分图匹配
实现功能为二分图匹配 原理:匈牙利算法,核心思想--匹配上了就配,没直接匹配上也要通过前面的腾出位置让这个匹配上(详见:趣写算法系列之--匈牙利算法) 本程序以Codevs2776为例 详见Codev ...
- 【洛谷P3386】【模板】二分图匹配【网络流】
题目大意: 题目链接:https://www.luogu.org/problemnew/show/P3386 求一个二分图的最大匹配. 思路: 二分图匹配的模板.可以用匈牙利做. 听说这道题卡Dini ...
- 洛谷 P3386 【模板】二分图匹配
洛谷 P3386 [模板]二分图匹配 题目 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行 ...
- P3386 【模板】二分图匹配(匈牙利模板)
P3386 [模板]二分图匹配 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u ...
- P3386 【模板】二分图匹配(匈牙利算法)
展开 题目背景 二分图 感谢@一扶苏一 提供的hack数据 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入格式 第一行,n,m,e 第二至e+1行,每行两个正整数u ...
- Dinic二分图匹配 || Luogu P3386
题面:[模板]二分图匹配 思路:Dinic实现二分图匹配,要建一个超级源点(S)和超级汇点(T),分别定为N+M+1和N+M+2 然后S去和N中的数建正边和反边,正边权值为1,反边权值为0:M中的数去 ...
- 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)...
题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...
- 洛谷P3386:网络流之二分图匹配,最大流算法
二分图:我的理解是,对图中的点集,可分为两个集合U和V,使得两个集合之间存在通路,且集合内部不存在通路.如上图. 匹配:两两不含公共端点的边集合M 最大匹配:边数最多的匹配 完美匹配:最大匹配的匹配数 ...
- 算法补完计划(五) 二分图匹配
二分图 如果一张图能被分为两部分,两部分之间存在边相连,而单个部分内的结点无边相连,那这张图叫做二分图 判断二分图 我们给图进行染色,从一个点开始染成红色,相邻点染蓝色,最后能全部染完,并且任意相邻点 ...
- 模板 - 二分图(包含全套常用定理性质)
整理的算法模板合集: ACM模板 目录 染色法判断二分图 增广路的性质 一些二分图的概念和定理 增广路定理 二分图最大匹配 二分图完美匹配 霍尔定理(hall 定理) 霍尔定理推论 匈牙利算法 二分图 ...
最新文章
- 【计算理论】不可判定性 ( 停机问题 | 图灵机语言是否空集问题 | 图灵机是否等价问题 | 是否存在自动机接受图灵机语言问题 | 莱斯定理 Rice‘s Theorem )
- Py之argparse:Python库之argparse(命令行解析)简介、安装、使用方法之详细攻略
- 计算机组成原理手动在线模式,实验四计算机组成原理 运算器手动实验
- TensorFlow, PyTorch, Caffe2的比较
- iview中嵌套使用tabs注意事项
- matlab 功率谱分析函数psd用法
- 如何基于tomcat构建web站点
- WebLogic11g-创建域(Domain)及基本配置
- FireBug 调试JS
- 使用LogParser分析IIS网站日志
- 手动实现一个迷你版的AOP(实战增强版)
- 第3章 别碰白块(《C和C++游戏趣味编程》配套教学视频)
- [转载] python程序所需的图片通过base64编码成字符串放在代码中
- html中rowspan设置动态值_大众标准里机器人程序中P值的设置存在那里?
- 快速开发jQuery插件的10大技巧(转)
- MATLAB画函数图像
- 【大咖有约】58同城孙玄:58同城从MongoDB到MySQL迁移之路
- exchange2010安装
- 服务器虚拟机迁移的过程和步骤是什么,虚拟机迁移的详细步骤(新手如何做好虚拟机迁移)...
- java基础学习总结——方法的重载(overload)
热门文章
- Onestage Grounding
- MSRA显著性检测数据集
- html table 合并单元格 分页,Word表格跨页,合并单元格后,希望跨页的每一页都显示合并单元格的内容(有图)...
- ducter运维平台_专访运维管理开源平台负责人刁文波:Ducter能帮你!
- Spring入门-1-基本配置和IOC、DI
- Ansible Ad—hoc 模式常用模块
- 线性代数 --- 三种计算矩阵的行列式的方法之二 莱布尼兹展开法(个人笔记扫描版)
- docker网络模式与资源控制
- 高德地图API - 根据经纬度获取周边建筑地标
- [CF796E Round#408 Div.2]Exam Cheating——[计数DP]