二分图
二分图
可以将一个图分为两部分,这两部分内部没有边,都是由一部分连向另外一部分
那么就称这个图为二分图
染色法判别二分图
如何判断二分图
不含奇数环是一个充要条件
只要没有奇数环,就是一个二分图,只要是一个二分图,就没有奇数环
所以我们可以通过染色的方式来判别一个图是不是二分图
首先选一个没有染色的点染上色,然后将与这个点联通的点染上不同的颜色
如果有一个点已经染了色并且这个将要染成不同的颜色,那么就不是一个二分图
算法实现:
#include <iostream> #include <cstring> using namespace std; const int N = 100010, M = 200010; int n, m; int h[N], e[N], ne[N], 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) printf("Yes\n"); else printf("No\n"); return 0; }
匈牙利算法求二分图的最大匹配
什么是最大匹配
加入有一堆男女,男的一堆,女的一堆
他们之间有一些感情
要求将有感情的男女匹配,使匹配数量最多
如何匹配呢
我们可以遍历所有男的,再遍历与他有感情的女的
如果这个女的没有男的与她匹配,那么他俩就匹配成功
如果已经有男的与她匹配,那就看看这个男的可不可能再与其他女的匹配
算法实现:
#include <iostream> #include <cstring> using namespace std; const int N = 510, M = 100010; int n1, n2, m; int h[N], e[M], ne[M], idx; int match[N]; bool st[N]; void add(int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ; } bool find(int x) { for (int i = h[x]; i != -1; i = ne[i]) { int j = e[i]; if (!st[j]) { st[j] = true; if (match[j] == 0 || find(match[j])) { match[j] = x; return true; } } } return false; } int main() { scanf("%d%d%d", &n1, &n2, &m); memset(h, -1, sizeof h); while (m -- ) { int a, b; scanf("%d%d", &a, &b); add(a, b); } int res = 0; for (int i = 1; i <= n1; i ++ ) { memset(st, false, sizeof st); if (find(i)) res ++ ; } printf("%d\n", res); return 0; }
本文作者:张詠然
本文链接:https://www.cnblogs.com/zyrddd/p/16637568.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步