二分图
二分图
二分图的定义
二分图指的是无向图 \(G\) 中,\(N\) 个节点可以划分为两个集合 \(A\) 和 \(B\),集合 \(A\) 和 \(B\) 内部没有连边,\(A\) 和 \(B\) 之间可以连边。
二分图的判断方法
二分图的判定:没有奇环。
没有奇环实际上就是在染色的时候相邻的点不会染相同颜色。
二分图的最大匹配
在一张二分图中选取最多的不共点的边,边数就是最大匹配。
匈牙利算法
二分图的左部向右部建边,
枚举左部尚未匹配的点 \(x\), 从 \(x\) 出发找增广路径到达右部没有匹配的 \(y\)。
如果找不到就让之前匹配的点重新匹配。
C++ 代码(仅算法部分)
int dfs(int u) { // 匹配第 u 个点
for (int i = head[u]; i; i = e[i].next) { // 枚举与 u 相邻的点
int to = e[i].to;
if (vis[to]) continue; // 如果该点被访问过了,就不访问了
vis[to] = true; // 标记该点
if ((!match[to]) || dfs(match[to])) { // 如果该点当前没有匹配或者可以让已经被 to 匹配的点换一个点匹配,那么 to 就可以成功匹配到 u
match[to] = u; // 标记 to 已经与 u 匹配
return true; // 成功!返回 true
}
}
return false; // 失败!返回 false
}
int main() {
// 其他代码
int cnt = 0;
for (int i = 1; i <= n1; i++) {
memset(vis, 0, sizeof(vis)); // 初始化 vis 数组
cnt += dfs(i); // 统计答案
}
// 其他代码
}
最小点覆盖
最小点覆盖定义
最小点覆盖:用最少的点覆盖所有的边。
最大点覆盖结论
结论:二分图的最小点覆盖 = 二分图的最大匹配。
建模特征
每一条边的 \(2\) 个断电 “至少” 有 \(1\) 个落在最小点覆盖的点集中。
最大独立集
最大独立集的定义
在无向图 \(G\) 中,选取最大的点集 \(S\),\(S\) 内任意两点之间都没有连边。
最大独立集的结论
二分图的最大独立集 = 总点数 \(N\) - 二分图的最小点覆盖(二分图的最大匹配)
最大团
最大团的定义
在无向图 \(G\) 中选取最大的点集 \(S\),\(S\) 内任意两点之间都有直接连边。
补图的定义
在无向图 \(G\) 中,原来连边的点不连边,原来不连边的点连边,得到补图 \(G'\)。
最大团的转化
原图的最大团等价于补图的最大独立集。
二分图中的博弈论
问题模型
在一张二分图中,\(2\) 人博弈,先手选择一种颜色,后手选择另外一种颜色,\(2\) 中颜色的点之间有若干连边,每次只能选择邻接点行动,问先手是否有必胜策略。
思路
以 P4055 为例讲解:
点击查看题目
分析
- 棋盘黑白染色;
- 有障碍物不能走,每个人走的格子颜色保持不变;
引入:二分图的完美匹配是指每个点都在最大匹配中。二分图的最大匹配的必选点是指所有最大匹配的方案都需要的点。
策略:
- 若二分图是完美匹配,则先手必败,因为后手总是可以选择先手的匹配点行动。
- 若二分图不是完美匹配,则先手必胜,只要先手第一步选择最大匹配的“非必选点”,那么后手就一定率先进入最大匹配,所以先手必胜。
求“非必需点”的方法:
- 跑一遍二分图最大匹配,则没有参与匹配的点一定是非必选点;
- 枚举非必选点 \(x\),从 \(x\) 跑到对面的点 \(y\),若能则点 \(z\) 一定是非必选点,因为 \(x--y\) 可以替换 \(z--y\)。
- 注意右部的非必选点也要重复步骤 \(1-2\)。