目录
- 1 介绍
- 2 训练
- 3 参考
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:372棋盘覆盖
C++代码如下,
3 参考
染色法判断二分图
匈牙利算法求最大匹配