二分图
概念(本片大部分来自蓝书):
一张无线图N个节点(N≥2)可以被分成A,B两个非空集合,其中A∩B=∅,并且在同一集合内的点之间都没有相连,那么这张无向图为一张二分图。A,B分别称为二分图的左部和右部。
判断
定理
一张无向图是二分图,当且图中不存在奇环(长度为奇数的环)
用染色进行二分图判断
思想
用黑白两种颜色标记图中的节点,当一个节点被标记后,它的所有相邻节点应该被标记为相反的颜色。若标记过程中产生冲突,则有奇环。复杂度O(n+m)
有什么用
个人感觉,这个判定,可能是你当题目看不出这个结论来时,试试能不能二分图。让你直接判断是不是二分图的题目一生也不会碰到很多的,或者题目有部分分有关于这种情况,那么这个判定会有点用……
模板(还是来源蓝书)
void dfs(int x,int color)
赋值 v[x] ← color
对于与x相连的每条无向边(x,y)
if v[y]=0 than
dfs(y,3-color)
else if v[y] = color then
判定无向图不是二分图,算法结束
int main()
for i←1 to N
if v[i] = 0 then dfs(i,1)
判定无向图是二分图
例题
NOIP2010 关押罪犯
二分图最大匹配
概念
二分图中,包含边数最多的一组匹配被称为二分图的最大匹配
例子
比如哲♂学三兄弟想再找几个男朋友~(显然哲学三兄弟的朋友特别多)
那肯定是三兄弟选了
他们分别喜欢连线的男朋友
显然,为了能选到更多,肯定是这样最优
或者是这样
等等…………
但我们只要考虑最多有几个男生会被选中~
显然我吗可以推论出:
二 分 图 的 一 组 匹 配 S 是 最 大 匹 配 , 当 且 仅 当 图 中 不 存 在 S 的 增 广 路 二分图的一组匹配S是最大匹配,当且仅当图中不存在S的增广路 二分图的一组匹配S是最大匹配,当且仅当图中不存在S的增广路
等等,这显然太快了……
增广路??
可增广路
匈牙利算法
非伪代码的模板:
#include<bits/stdc++.h>
using namespace std;
const int N