题面:【模板】二分图匹配

思路:Dinic实现二分图匹配,要建一个超级源点(S)和超级汇点(T),分别定为N+M+1和N+M+2

然后S去和N中的数建正边和反边,正边权值为1,反边权值为0;M中的数去与T建正边和反边,正边权值为1。

N、M之间的数建图一样。

然后就去跑最大流。

注意:在Dinic函数中每次更新Cur的值时,要把S和T的Cur也更新了。

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #define min(a,b) ((a)<(b)?(a):(b))
 5 using namespace std;
 6 const int maxn=1050,maxm=maxn,maxe=maxm*maxn;
 7 int N,M,u,v,E,num_edge=-1,edge_head[maxn+maxm],Q[maxn+maxm],f1,f2,Dep[maxn+maxm];
 8 int S,T,Cur[maxn+maxm];
 9 struct Edge{int to,nx,dis;}edge[maxe];
10 inline void Add_edge(int from,int to,int dis){
11     edge[++num_edge].nx=edge_head[from];
12     edge[num_edge].to=to;
13     edge[num_edge].dis=dis;
14     edge_head[from]=num_edge;
15     return;
16 }
17 inline bool Bfs(){
18     memset(Dep,0,sizeof(Dep));
19     f1=f2=1;
20     Dep[S]=1;
21     Q[f2++]=S;
22     while(f1<f2){
23         int x=Q[f1++];
24         for(int i=edge_head[x];i!=-1;i=edge[i].nx){
25             int y=edge[i].to;
26             if(edge[i].dis&&Dep[y]==0){
27                 Dep[y]=Dep[x]+1;
28                 Q[f2++]=y;
29             }
30         }
31     }
32     if(Dep[T])return 1;
33     return 0;
34 }
35 inline int Dfs(int x,int fw){
36     if(x==T)return fw;
37     for(int &i=Cur[x];i!=-1;i=edge[i].nx){
38         int y=edge[i].to;
39         if(Dep[y]==Dep[x]+1&&edge[i].dis){
40             int p=Dfs(y,min(edge[i].dis,fw));
41             if(p>0){
42                 edge[i].dis-=p;
43                 edge[i^1].dis+=p;
44                 return p;
45             }
46         }
47     }
48     return 0;
49 }
50 inline int Dinic(){
51     int ans=0;
52     while(Bfs()){
53         int toi=N+M+2;
54         for(int i=1;i<=toi;i++)Cur[i]=edge_head[i];
55         while(int k=Dfs(S,1<<30))ans+=k;
56     }
57     return ans;
58 }
59 int main(){
60     memset(edge_head,-1,sizeof(edge_head));
61     scanf("%d%d%d",&N,&M,&E);
62     S=N+M+1;T=N+M+2;
63     for(int i=1;i<=N;i++){
64         Add_edge(S,i,1);
65         Add_edge(i,S,0);
66     }
67     int toi=N+M;
68     for(int i=N+1;i<=toi;i++){
69         Add_edge(i,T,1);
70         Add_edge(T,i,0);
71     }
72     for(int i=1;i<=E;i++){
73         scanf("%d%d",&u,&v);
74         if(v>M||u>N)continue;
75         v+=N;
76         Add_edge(u,v,1);
77         Add_edge(v,u,0);
78     }
79     printf("%d\n",Dinic());
80     return 0;
81 }


By:AlenaNuna

转载于:https://www.cnblogs.com/AlenaNuna/p/10959317.html

Dinic二分图匹配 || Luogu P3386相关推荐

  1. AtCoder AGC037D Sorting a Grid (二分图匹配)

    题目链接 https://atcoder.jp/contests/agc037/tasks/agc037_d 题解 这场D题终于不像AGC032D和AGC036D一样神仙了-- 还是可做的吧 虽然考场 ...

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

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

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

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

  4. nyoj-239 月老的难题 (二分图匹配—匈牙利算法 网络流—Dinic算法)

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...

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

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

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

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

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

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

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

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

  9. AtCoder AGC029F Construction of a Tree (二分图匹配)

    题目链接 https://atcoder.jp/contests/agc029/tasks/agc029_f 题解 考虑如何才能构成一棵树:显然有一个必要条件是对于每个点\(u\)来说,整张图所有的边 ...

最新文章

  1. 查看服务器硬件配置信息(cpu/内存)
  2. jQuery中的表单对象属性过滤选择器(四、八)::enabled、:disabled、:checked、:selected...
  3. python类的空间问题及类之间的关系
  4. 大数据项目中的QA需要迎接新的挑战
  5. 张一鸣活捉上班摸鱼员工遭怒怼:不爽退群啊!
  6. 配置mysql 问题解决
  7. HBase之HFile索引机制
  8. 如何写一个Linux精灵进程
  9. CC2530之定时器T3
  10. 回归分析常数项t值没有显著异于零怎么办_SPSS线性回归|太方便了,别人不想告诉你的其他操作我都总结好了(中)...
  11. CAXA实体设计 2020 在草图中怎么快速选择与某一曲线相连的曲线?
  12. Ant Design 与 Ant Design Pro
  13. php 数字上下选取,选择性粘贴数值快捷键是什么
  14. ionic4 click防抖指令
  15. 国王、总统、首相、总理……京城第一饭店的40春秋 | 美通社头条
  16. 云桌面服务器中兴,随需而动——中兴通讯VDI+VOI融合云桌面解决方案
  17. 001 | “版绘童印”——疫情时代下版画在儿童插画中应用研究 | 大学生创新训练项目申请书 | 极致技术工厂
  18. 囧妈 一场不需要“电影院”的电影
  19. C/C++ 文件设备操作之CreateFile、ReadFile和WriteFile
  20. 网秦手机杀毒软件 v2.1 symbian uiq 是什么

热门文章

  1. 用基于模型和接口的T4来生成RESTful服务
  2. kotlin中的异常处理_如何使用assertFailsWith在Kotlin中测试异常
  3. 什么是导师负责制_为什么一个导师是不够的
  4. 10、同步机制遵循的原则_我要遵循的10条原则
  5. java 方法里面定义接口_java – 当接口A在其方法签名中定义接口B时
  6. linux虚拟机文件挂载
  7. JavaScript实现智能搜索框
  8. 1023 Have Fun with Numbers
  9. html5展示json数据库,显示数据在html5从数据库使用javascript和json
  10. 3- MySQL数据类型