二分图
染色法
二分图当且仅当图中不含奇数环。由于图中不含有奇数环,所以染色过程中一定没有矛盾。
860. 染色法判定二分图
给定吧一个n个点m条边的无向图,图中可能存在重边和自环。
请你判断这个图是否是二分图。
输入格式
第一行两个整数n和m。
接下来m行,每行包含两个整数u和v,表示u和v之间存在一条边。
输出格式
如果给定图是二分图,则输出Yes,否则输出No。
数据范围
输入样例:
4 41 31 42 32 4
输出样例:
Yes
代码
#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 100010, M = 200010;int n, m;int h[N], e[M], ne[M], idx;int color[N];void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx ++;}bool dfs(int u, int c) {color[u] = c;for (int i = h[u]; i != -1; i = ne[i]) {int j = e[i];if (!color[j]) {if (!dfs(j, 3 - c)) return false;} else if (color[j] == c) return false;}return true;}int main() {scanf("%d%d", &n, &m);memset(h, -1, sizeof h);while (m --) {int a, b;scanf("%d%d", &a, &b);add(a, b), add(b, a);}bool flag = true;for (int i = 1; i <= n; i ++)if (!color[i]) {if (!dfs(i, 1)) {flag = false;break;}}if (flag) puts("Yes");else puts("No");return 0;}
匈牙利算法
861. 二分图的最大匹配
给定一个二分图,其中左半部分包含n1个点(编号1~n1),右半部分包含n2个点(编号1~n2), 二分图包含m条边。数据保证任意一条边的两个端点都不可能在同一部分中。
求二分图的最大匹配数。
输入格式
第一行包含三个整数n1,n2和m.
接下来m行,每行包含两个整数u和v,表示左半部点集中的点u和右半部点集中的点v之间存在一条边。
输出格式
输出一个整数,表示二分图的最大匹配数。
数据范围,
,
,
输入样例
输出样例
