Icebound

icebound-area

NOIP二分图相关

本来字符串处理相关快写完了。。结果手抖给弄没了。。于是打算填上图论的坑。那么先把今天讲的二分图相关写了吧。

个人认为写的很烂。。。

 

1 二分图的定义与判定

【二分图一般指无向图】对于无向图G,如果可以将图分成两部分S,T,S,T之间有边相连,而S,T自己内部没有边,则称该无向图为二分图。

当然,也有有向图称作无向图的时候。

区别二分图,关键是看点集是否能分成两个独立的点集。对于某图G。我们可以利用交叉染色法判定其是否为二分图。。就是DFS一遍,给他按照黑,白,黑,白的顺序染色,如果发现出现矛盾,则不是二分图,图中有可能有奇环存在。

【补充 重要定理:】

【图中的一个连通块中有奇环,则该连通块中全是奇环。】

 

2 二分图最大匹配

【任意两条边都没有公共端点】的边的集合称为图的匹配。二分图的最大匹配即为找到最多的这样的边

一般我们在数据范围小时采取匈牙利算法,范围大时采取网络流。

算法的具体实现我就不说了。。大家都会。。。

还是说一些经典的问题吧。。比较经典的就是棋盘上面的问题了。

给定一个N行M列的棋盘,已知某些位置禁止放置,求能够放到棋盘上的1*2多米诺骨牌的最大个数?

给定一个N*M的棋盘,有一些格子不能放置棋子,问棋盘上最多能放多少个马,使它们不能相互攻击。

给定一个N*M的棋盘,有一些格子不能放置棋子,问棋盘上最多能放多少个車,使它们不能相互攻击。

有一个N*M(N,M<=50)的棋盘,棋盘的每一格是三种类型之一:空地、草地、墙。机器人只能放在空地上。在同一行或同一列的两个机器人,若它们之间没有墙,则它们可以互相攻击。问给定的棋盘,最多可以放置多少个机器人,使它们不能互相攻击。

 

前两个题显然先对棋盘进行黑白染色,然后把白点和黑点看成两部分,暴力连边做匹配即可。第二个是最大独立集

后两个题都是把行和列看成两部分。显然放车的直接按行列为点,交叉位置为边连接就行。而最后一个需要先横着扫一遍,竖着扫一遍。把横向出来的和竖向出来的交叉部分看成边,连起来跑二分图匹配即可。

 

3一些奇怪的定理

我先都列出来吧。。

 

二分图最小点覆盖=二分图最大匹配

最小路径覆盖=点数-最大匹配。

二分图最大独立集=点数-最大匹配

二分图最大团=补图的最大独立集

【有没有感觉到世界的恶意】

感性感知如下:

 

二分图最小点覆盖=二分图最大匹配:

如果有一条边的两个顶点全不在最大匹配的点上,那么又会多出一条匹配边,所以二分图最小点覆盖<=二分图最大匹配。

如果最小点覆盖比最大匹配小,那么最小点覆盖肯定缺少了一些边。所以二分图最小点覆盖>=二分图最大匹配。

所以二分图最小点覆盖=二分图最大匹配

 

最小路径覆盖=点数-最大匹配&&二分图最大独立集

原谅我,我不会

 

二分图最大团=补图的最大独立集

这是显然的。。。。。

 

 

【关于最小路径覆盖】

DAG上最小路径覆盖-》直接跑

无向图最小路径覆盖-》除以2

不要求每个点只走一次的最小路径覆盖-》floyd

 

4 二分图最大匹配可行边和必须边

 

可行边:

包含在某一个最大匹配方案中的边

对应网络流残量网络tarjan缩点后边的端点在同一个联通分量上或本身是匹配边

必须边:

包含在任意一个最大匹配方案中的边。

对应网络流残量网络tarjan缩点后边的端点在不在同一个联通分量上且本身是匹配边

 

 

感觉自己写了一些很没用的东西。。就是这样。。

算是总结一下吧。。

  1. tzg说道:

    然而还是要orz (没了奖品就可以rp++了这样也是不错的)

  2. Name说道:

    为什么从匈牙利算法点进来是这个

    1. icebound说道:

      因为解二分图匹配最常用的算法是匈牙利算法