二分图 笔记
本文原在 2024-07-15 16:21 发布于本人洛谷博客。
一、定义
一个图能分成两部分,每一部分的点之间不存在边直接相连。
二、基本性质
没有奇长度的环。
三、
1. 判断二分图
黑白染色,走一步换一种颜色,如果有个点有两种颜色,那就不是二分图。
2. 最大匹配
将二分图左右一一匹配的最大对数。
简单好记方法:
-
如果 B0 喜欢的女生 G0 还没有男朋友,就直接组 cp。
-
如果 G0 有男朋友 B1 了,B1 再找一个没有男朋友的 G1,把 B0 和 G0 组 cp。
-
如果 B1 找不到没有男朋友的女生了,那就不把 G0 让给 B0,B0 单身。
#include <bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
const int N = 1e3 + 10;
int n, m, e, ans, vis[N], mat[N];
vector<int> g[N];
bool dfs(int u, int tag) {
if (vis[u] == tag)
return false;
vis[u] = tag;
for (int v : g[u])
if (!mat[v] or dfs(mat[v], tag)) {
mat[v] = u;
return true;
}
return false;
}
signed main() {
IOS;
cin >> n >> m >> e;
for (int i = 1, u, v; i <= e; i++) {
cin >> u >> v;
g[u].push_back(v);
}
for (int i = 1; i <= n; i++)
if (dfs(i, i))
ans++;
cout << ans;
return 0;
}
3. 最小覆盖集
选最少的点,使二分图中每一条边都至少有一个端点被选择。
根据 König 定理,二分图的最小覆盖集等于最大匹配。
4. 最大独立集
选最多的点,使选中的点间没有边直接相连。
二分图的最大独立集等于总点数减去最小覆盖集。

浙公网安备 33010602011771号