二分图
二分图
构建二分图当且仅当不含奇数环
染色法
匈牙利算法
染色法判断二分图
如果是二分图的话,说明我们可以讲点进行均等分,也就是说我们一定不能出现奇数环
染色法主要是用1 和 2 对图中的每一个点进行标记颜色,如果出现颜色间隔相同,或者一些矛盾的情况,那么说明不是二分图
bool dfs(int u,int v) { |
匈牙利算法
匈牙利算法又名找唯一对象算法
主要使用来解决匹配问题
保证二分图两边互相匹配,并且不会出现脚踏两只船的情况
常见题型
给定一个二分图,其中左半部包含 n1n1 个点(编号 1∼n11∼n1),右半部包含 n2n2 个点(编号 1∼n21∼n2),二分图共包含 mm 条边。
数据保证任意一条边的两个端点都不可能在同一部分中。
请你求出二分图的最大匹配数。
二分图的匹配:给定一个二分图 GG,在 GG 的一个子图 MM 中,MM 的边集 {E}{E} 中的任意两条边都不依附于同一个顶点,则称 MM 是一个匹配。
二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。
st数组的含义
st数组主要是用来判断妹子是否有合适的对象,每一次初始化st数组主要是为了执行st[j]里面判断这个妹子的对象是否有备胎的情况
如果不进行初始化的话,遍历后面的男的话,看到妹子(st)都被占有,一点争取的机会都没有了。。。
find(match[j])解释
这种情况的前提是这个妹子已经和别人匹配了,我们此时遍历的这个人也想追求她,于是想要尝试让与他配对的男的去寻找备胎
j代表的是这个妹子,match[j]代表的是与这个妹子处的另一个男的,再从这个男的出发,当然不会出现又去遍历那个妹子的情况,因为st[j]此时被最开始的男的占用了,直到找到没有被匹配的妹子为止
AC代码
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Freedom Coding!
评论
ValineDisqus