二分图 笔记
本文原在 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. 最大独立集
选最多的点,使选中的点间没有边直接相连。
二分图的最大独立集等于总点数减去最小覆盖集。
本文作者:Garbage fish's Blog
本文链接:https://www.cnblogs.com/Garbage-fish/p/18709924
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步