1 介绍
本专题用来记录二分图的题目。
以下条件互相等价:
- 一个图是二分图。
- 染色法过程中不存在矛盾。
- 图中不存在奇数环。
二分图本质上是一个无向图的问题!
结论:
最大匹配数 = 最小点覆盖 = 总点数 - 最大独立集 = 总点数 - 最小路径覆盖
2 训练
题目1:257关押罪犯
C++代码如下,
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
typedef pair<int, int> PII;
const int N = 20010;
int n, m;
vector<vector<PII>> g(N);
int color[N];
bool dfs(int a, int c, int mid) {
color[a] = c;
//看结点a能走到哪儿
for (auto [b, w] : g[a]) {
if (w <= mid) continue;
if (!color[b] && !dfs(b, 3 - c, mid)) return false;
if (color[b] && color[b] == c) return false;
}
return true;
}
bool check(int mid) {
memset(color, 0, sizeof color);
bool flag = true;
for (int i = 1; i <= n; ++i) {
if (!color[i] && !dfs(i, 1, mid)) {
flag = false;
break;
}
}
return flag;
}
int main() {
cin >> n >> m;
int a, b, w;
while (m--) {
cin >> a >> b >> w;
g[a].emplace_back(b, w);
g[b].emplace_back(a, w);
}
int l = 0, r = 1e9;
int res = -1;
while (l <= r) {
int mid = (l + r) / 2;
if (check(mid)) {
r = mid - 1;
res = mid;
} else {
l = mid + 1;
}
}
cout << res << endl;
return 0;
}
题目2: