当前位置: 首页 > news >正文

二分图最大匹配 Dinic/EK算法

方法

二分图转换成网络流模型;创建虚拟源点和汇点,将源点连上左边所有点,右边所有点连上汇点,容量皆为1。原来的每条边从左往右连边,容量也皆为1,最大流即最大匹配
image

code:洛谷P3386

dinic:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=510,M=1e5+10+(N<<2);
struct edge{LL v,c,ne;}e[M];
int h[N<<1],id=1;
int cur[N<<1],s,t,dep[N<<1];
int n,m,num;
void add(int u,int v,int c){e[++id]={v,c,h[u]};h[u]=id;
}bool bfs(){memset(dep,0,sizeof(dep));queue<int> q;q.push(s);dep[s]=1;while(q.size()){int u=q.front();q.pop();for(int i=h[u];i;i=e[i].ne){int v=e[i].v;if(dep[v]==0&&e[i].c){dep[v]=dep[u]+1;q.push(v);if(v==t)return true;}}}return false;
}LL dfs(int u,LL mf){if(u==t)return mf;LL sum=0;for(int i=cur[u];i;i=e[i].ne){cur[u]=i;int v=e[i].v;if(dep[v]==dep[u]+1&&e[i].c){LL f=dfs(v,min(mf,e[i].c));sum+=f;mf-=f;e[i].c-=f;e[i^1].c+=f;if(mf==0)break;}}if(sum==0)dep[u]=0;return sum;
}int dinic(){int flow=0;while(bfs()){memcpy(cur,h,sizeof(h));flow+=dfs(s,1e9);}return flow;
}int main(){cin.tie(nullptr)->sync_with_stdio(false);cin>>n>>m>>num;for(int i=1;i<=num;i++){int u,v;cin>>u>>v;add(u,v+n,1);add(v+n,u,0);}s=0;t=n+m+1;for(int i=1;i<=n;i++){add(s,i,1);add(i,s,0);}for(int i=1;i<=m;i++){add(i+n,t,1);add(t,i+n,0);}cout<<dinic()<<endl;return 0;
}

EK:

#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=1e5+10+(N<<1);
typedef long long LL;
struct edge{LL v,c,ne;}e[M];
int h[N],id=1;
int mf[N],pre[N];
int n,m,num,s,t;
void add(int u,int v,int c){e[++id]={v,c,h[u]};h[u]=id;
}bool bfs(){memset(mf,0,sizeof(mf));queue<int> q;q.push(s);mf[s]=1e9;while(q.size()){int u=q.front();q.pop();for(int i=h[u];i;i=e[i].ne){int v=e[i].v;if(mf[v]==0&&e[i].c){mf[v]=min(1ll*mf[u],e[i].c);q.push(v);pre[v]=i;if(v==t)return true;}}}return false;
}LL EK(){LL flow=0;while(bfs()){flow+=mf[t];int v=t;while(v^s){int i=pre[v];e[i].c-=mf[t];e[i^1].c+=mf[t];v=e[i^1].v;}}return flow;
}int main(){cin.tie(nullptr)->sync_with_stdio(false);cin>>n>>m>>num;for(int i=1;i<=num;i++){int u,v;cin>>u>>v;add(u,v+n,1);add(v+n,u,0);}s=0;t=n+m+1;for(int i=1;i<=n;i++){add(s,i,1);add(i,s,0);}for(int i=1;i<=m;i++){add(i+n,t,1);add(t,i+n,0);}cout<<EK()<<endl;return 0;
}
http://www.zskr.cn/news/16854.html

相关文章:

  • 爱,在行动中生长,我们因爱而变得辽阔——《岛上书店》读后感
  • 《二千年间》在线阅读
  • 实用指南:Java 单例模式详解
  • 数据结构与算法学习笔记(Acwing 提高课)----动态规划树形DP - 详解
  • CCPC2023哈尔滨 游记(VP)
  • 【OpenGL ES】Windows上OpenGL环境搭建
  • 状态压缩 DP
  • QGIS开发笔记(四):QgsRasterLayer加载Cesium二维地图的瓦片地图数据到QGIS
  • [数学 - 线性回归]
  • 基于Python+Vue开发的大学竞赛报名管理系统源码+运行步骤
  • 数据大屏
  • AI元人文的硅基基石体系:EPU+VPU+WBUC+WAUC深度解析——声明Ai解析
  • 高频感应钎焊在制冷行业的应用与优势:高效、绿色、智能的焊接革命!
  • Educational Codeforces Round 183 (Rated for Div. 2)题解
  • 干货分享:无需下载,在线快速编辑图片的完整教程
  • 详细介绍:如何有效删除 iPhone 上的所有内容?
  • m3u8在线播放测试的方法与常见问题解决方案(附网页演示
  • KaTeX手册
  • Qt编写上下界面切换效果/前进到下一个界面/后退到上一个页面/零件工艺及管理设计系统
  • 深入解析:OpenCV CUDA模块图像处理------创建CUDA加速的Canny边缘检测器对象createCannyEdgeDetector()
  • busybox 没有 clear 命令吗
  • 高阶数据结构——并查集 - 详解
  • 经过基于流视频预测的可泛化双手运行基础策略
  • 实用指南:实践篇:利用ragas在自己RAG上实现LLM评估②
  • Nova Premier模型安全评估结果解析
  • Paypal 设置不自动换汇
  • 诺贝尔生理与医学奖颁给这项革命技术,多家中国公司已布局!(附名单)
  • 华为员工工资待遇表:
  • 体验mcp服务的开发集成和演示过程 - 智慧园区
  • AI技术全景解析:从架构设计到社会影响