二分图 笔记

本文原在 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. 最大独立集

选最多的点,使选中的点间没有边直接相连。

二分图的最大独立集等于总点数减去最小覆盖集。

posted @ 2025-02-11 16:02  Garbage_fish  阅读(19)  评论(0)    收藏  举报