【图论】图的匹配问题
图的匹配问题(二分图(最大)匹配)
概念
- 边集中边数最大为最大匹配,边权和最大的为最大权匹配 。
- 完全匹配,也叫做完备匹配,即某个匹配中,每个顶点都和某条边相关联。
- 点覆盖集 :无向图的一个点集,使得该图中的所有边至少有一个端点在该集合内。点数最少的点覆盖集被称为最小点覆盖集。
- 点独立集 :无向图的一个点集,使得该集合中任意两个点之间不连通。点数最多的点被称为最大点独立集。
- 二分图:可以将点分成两个集合,使得每条边的端点都不在一个集合里,两个集合的点称左部点和右部点,没有节点个数为奇数的环
二分图匹配
二分图的最小点覆盖集大小+最大点独立集大小=图中点的个数
染色法:
1 | vector<int> G[N]; |
增广路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边⋯形成的路径叫交替路。整个路径两个端点都是未匹配点,这条路就是增广路。
二分图最大匹配
-
一个边集使得每条边没有公共端点
-
增广路定理:找不到增广路则当前匹配就是最大匹配,如果找得到只需要翻转增广路的匹配边和非匹配边。
匈牙利算法
- 对于左部点 ,枚举所有连边,出点 若没有匹配直接匹配(找到增广路),否则让 之前的匹配左部点递归匹配右部点(每一轮递归右部点只能访问一次)找增广路,如果找到未匹配点即找到增广路,则 与 匹配,否则 失配。左部点比右部点少可以优化。复杂度 。
- linker[v]=u 就是匹配方案
1 | int uN, vN; //左右部点的数目,注意访问的起点是0/1 |
Dinic(网络流)
- 建超级源点 ,向左部点各连一条容量为 的路
- 建超级汇点 ,右部点向其各连一条容量为 的路
- 给定边,左部点向右部点连一条容量为 的路
- 注意节点总数、加边的点序号