二次联通门 : luogu P3386 【模板】二分图匹配

  1. /*
  2. luogu P3386 【模板】二分图匹配
  3.  
  4. 最大流
  5. 设置源点,汇点,连到每条边上
  6. 跑一边最大流即可
  7. */
  8. #include <iostream>
  9. #include <cstring>
  10. #include <cstdio>
  11. #include <queue>
  12.  
  13. #define Max 100008
  14. #define INF 1e7
  15.  
  16. using namespace std;
  17.  
  18. inline int min (int a, int b)
  19. {
  20. return a < b ? a : b;
  21. }
  22.  
  23. void read (int &now)
  24. {
  25. now = ;
  26. char word = getchar ();
  27. while (word > '' || word < '')
  28. word = getchar ();
  29. while (word >= '' && word <= '')
  30. {
  31. now = now * + word - '';
  32. word = getchar ();
  33. }
  34. }
  35.  
  36. struct Edge
  37. {
  38. int from;
  39. int to;
  40. int flow;
  41. int next;
  42. }edge[Max << ];
  43.  
  44. int deep[Max];
  45. int Edge_Count;
  46. int edge_list[Max];
  47. int S, T;
  48.  
  49. inline void AddEdge (int from, int to, int dis)
  50. {
  51. Edge_Count++;
  52. edge[Edge_Count].to = to;
  53. edge[Edge_Count].flow = dis;
  54. edge[Edge_Count].next = edge_list[from];
  55. edge_list[from] = Edge_Count;
  56. }
  57.  
  58. int Get_Flow (int now, int flow)
  59. {
  60. if (now == T || flow <= )
  61. return flow;
  62. int res = , pos;
  63. for (int i = edge_list[now]; i; i = edge[i].next)
  64. {
  65. if (deep[edge[i].to] != deep[now] + || edge[i].flow <= )
  66. continue;
  67. pos = Get_Flow (edge[i].to, min (edge[i].flow, flow));
  68. edge[i].flow -= pos;
  69. edge[i ^ ].flow += pos;
  70. res += pos;
  71. flow -= pos;
  72. if (flow <= )
  73. return res;
  74. }
  75. return res;
  76. }
  77.  
  78. int E, N, M;
  79. int Answer;
  80.  
  81. void Bfs ()
  82. {
  83. while (true)
  84. {
  85. bool flag = false;
  86. memset (deep, -, sizeof deep);
  87. queue <int> Queue;
  88. Queue.push (S);
  89. deep[S] = ;
  90. int now;
  91. while (!Queue.empty ())
  92. {
  93. now = Queue.front ();
  94. Queue.pop ();
  95. for (int i = edge_list[now]; i; i = edge[i].next)
  96. if (deep[edge[i].to] < && edge[i].flow)
  97. {
  98. deep[edge[i].to] = deep[now] + ;
  99. if (edge[i].to == T)
  100. {
  101. flag = true;
  102. break;
  103. }
  104. Queue.push (edge[i].to);
  105. }
  106. if (flag)
  107. break;
  108. }
  109. if (deep[T] <= )
  110. break;
  111. Answer += Get_Flow (S, INF);
  112. }
  113. }
  114.  
  115. int main (int argc, char *argv[])
  116. {
  117. read (N);
  118. read (M);
  119. read (E);
  120. S = Max - ;
  121. T = Max - ;
  122. int x, y;
  123. for (int i = ; i <= E; i++)
  124. {
  125. read (x);
  126. read (y);
  127. if (x > M || y > M)
  128. continue;
  129. AddEdge (x, N + y + , );
  130. AddEdge (N + y + , x, );
  131. }
  132. for (int i = ; i <= N; i++)
  133. {
  134. AddEdge (S, i, );
  135. AddEdge (i, S, );
  136. }
  137. for (int i = ; i <= M; i++)
  138. {
  139. AddEdge (N + i + , T, );
  140. AddEdge (T, N + i + , );
  141. }
  142. Bfs ();
  143. printf ("%d", Answer);
  144. return ;
  145. }

luogu P3386 【模板】二分图匹配的更多相关文章

  1. [洛谷P3386] [模板] 二分图匹配 (匈牙利算法)

    题目传送门 毒瘤出题人zzk出了个二分图匹配的题(18.10.04模拟赛T2),逼我来学二分图匹配. 网络流什么的llx讲完之后有点懵,还是匈牙利比较好理解(绿与被绿). 对于左边的点一个一个匹配,记 ...

  2. 【洛谷 p3386】模板-二分图匹配(图论)

    题目:给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数. 解法:匈牙利算法.(以前我总是不记得......)实质上应该有贪心的思想,每次都尽量匹配,找到能和自己匹配的也尽量让它们匹配 ...

  3. 模板——二分图匹配KM

    具体方法就不介绍了,详见 https://blog.csdn.net/sixdaycoder/article/details/47720471 主要讲一些注意点: 1:不直接将未匹配的y减小是因为要保 ...

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

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

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

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

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

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

  7. AC日记——【模板】二分图匹配 洛谷 P3386

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

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

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

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

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

随机推荐

  1. 准备写个Golang开发的教程

    进入golang的开发已经差不多两年了,最近打算写个Golang的教程.目的是让有开发基础,没接触过Golang的人能够愉快高效地写出Golang项目. 1 记得17年底时候,有个特别小的项目,准备试 ...

  2. 【并发】8、借助redis 实现多线程生产消费阻塞队列

    顾名思义这个就是再消费的时候,不是之前的那哥用yield进行线程切换的操作,而是用线程等待阻塞的方式去执行,说实话我感觉效率不一定有之前那个好, 因为我对这种阻塞队列使用的时候,之前有发现阻塞队列,塞 ...

  3. 启动 docker 容器时报错

    错误信息: iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9300 -j DNAT --to-dest ...

  4. js垃圾回收及内存泄漏

    js垃圾回收 js能够自动回收申请却未使用的内存,由于每次清除需要的性能较大,不是时时在刷新,而是每隔一段时间才进行一次. 回收的两种方式 标记清除(常用) 在内存中先标记变量,然后清除那些那些进入环 ...

  5. OpenStack kilo版(6) 启动第一台虚拟机

    创建网络 提供者为external,类型为flat,网络名称为public,: root@controller:~# neutron net-create --shared --provider:ph ...

  6. Linux学习之五-Linux系统终端常用的快捷键

    Linux系统终端常用的快捷键 (使用快捷键能大大提高效率,部分用在远程登录的工具如Xshell下) 剪切板操作(终端不支持,因为终端是纯命令行) Ctrl+insert     复制 Shift+i ...

  7. SSH安全优化

    更改远程连接登陆的端口 禁止root管理员直接登陆 密码认证方式改为密钥认证 重要服务不使用公网IP地址 使用防火墙来限制来源IP地址 Port 666                变更SSH服务远 ...

  8. sqlalchemy.exc.CompileError: (in table 'user', column 'username'): VARCHAR requires a length on dialect mysql

    映射数据库时报错:sqlalchemy.exc.CompileError: (in table 'user', column 'username'): VARCHAR requires a lengt ...

  9. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-E. Let Them Slide-思维+数据结构

    Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-E. Let Them Slide-思维+数据结构 [Problem ...

  10. PHP 把返回的数据集转换成Tree树

    /** * 把返回的数据集转换成Tree * @access public * @param array $list 要转换的数据集 * @param string $pid parent标记字段 * ...