二分图与匈牙利
-----By 蒟蒻鱼
二分图
- 是啥
将一个无向图的点分为两个集合且两个点集中的点在各自集合中互不相连则称这个图为二分图.
- 性质
一个无向图是二分图,当且仅当它不包含奇环
一个无向图是二分图,当且仅当它可以二染色
- 判定
无向图K为二分图的充分必要条件是
1.K至少包含两个点
2.其回路的长度均为偶数
实现代码
二染色判定二分图
bool paint(now, mark)
{
if (color[now] == 0)
color[now] = mark;
else if (color[now] != mark)
return false;
int k=head[now];
while (k!=0){
if(paint(e[k], -mark)==false)
return false; k=next[k]; //如出现冲突则说明这不是
}
return true; //没有出现冲突说明此图是二分图
}
二分图的匹配
- 是啥
对于一个二分图K的子图T
若T的边集E的任意两条边都不连接同一个点,则称T为K的一个匹配
关于二分图的最大匹配
- 匈牙利算法
首先了解一个定义:增广路
定义:
设M是二分图G的一个匹配,P是G中一个连通两个未匹配点的路径,且属于M的边与不属于M的边交替出现,则称P为相对于M的一条增广路.
由增广路的定义可以推出下述三个结论 //抄的 感谢傲梦
1.增广路的路径长度必定为奇数,第一条边和最后一条边都未被匹配.
2.通过增广路的交错可以得到一个更大的匹配.
3.当且仅当不存在增广路是匹配数最大.