二分图【判定、最大匹配、最小点覆盖、最小路径覆盖及例题】

一、最大匹配

//之前学完二分图判定匹配就溜了。。。
定义:给定一个二分图G,在G的一个子图M中, M的边集{E}中的任意两条边都不交汇于同一个结点,则称M是一个匹配。选择边数最大的子图称为最大匹配问题
算法:即匈牙利算法,匈牙利算法是用来求二分图的最大匹配的,它的核心问题就是找增广路径。匈牙利算法的时间复杂度为O(VE),其中V为二分图左边的顶点数,E为二分图中边的数目。

匈牙利算法详解:
1、趣写算法系列之–匈牙利算法
2、匈牙利算法 + 代码理解

//差不多安难度排序
题目1:https://vjudge.net/problem/HDU-2063-过山车 (模板题)

题目2:https://vjudge.net/problem/HDU-3829-Cat VS Dog

题目3:https://vjudge.net/problem/HDU-4185-Oil Skimming

题目4:https://vjudge.net/problem/HDU-1281-棋盘游戏(最开始完全没想到和匹配有什么关系hhh and 让我想到了n皇后)

题目5:https://vjudge.net/problem/HDU-1045(猜一下它的建图和例3像还是和例4像(゚∀゚〃) )

二、最小点覆盖

定义:假如选了一个点就相当于覆盖了以它为端点的所有边。最小顶点覆盖就是选择最少的点来覆盖所有的边。
定理:最小顶点覆盖等于二分图的最大匹配。

证明:二分图的最小点覆盖-定理证明

求最小点覆盖:从右边所有没有匹配过的点出发,按照增广路的“交替出现”的要求DFS。最终右边没有访问过的点和左边访问过的点组成最小点覆盖。

题目1:http://poj.org/problem?id=3041

三、最大独立集

参考博客
定义: 选出一些顶点使得这些顶点两两不相邻,则这些点构成的集合称为独立集。找出一个包含顶点数最多的独立集称为最大独立集。
定理:最大独立集 = 所有顶点数 - 最小顶点覆盖 = 所有顶点数 - 最大匹配

证明:既然知道能够覆盖所有边的最小点 个数,那么去掉这些点后就是一个独立集

题目1:https://vjudge.net/problem/HDU-4619-Warm up 2

四、最小路径覆盖

参考(因为感觉他们都解释得很好,大部分就直接搬了嘻嘻):
参考博客1
参考博客2

定义: 通俗点将,就是在一个有向图中,找出最少的路径,使得这些路径经过了所有的点。
最小路径覆盖分为最小不相交路径覆盖和最小可相交路径覆盖。

最小不相交路径覆盖:每一条路径经过的顶点各不相同。如图,其最小路径覆盖数为3。即1->3>4,2,5。
最小可相交路径覆盖:每一条路径经过的顶点可以相同。如果其最小路径覆盖数为2。即1->3->4,2->3>5。

1、DAG的最小不相交路径覆盖
算法: 我们把每个点都拆成两个点,分为入点和出点,如果 u 到 v 有边,那么我们就让 u 的出点连向 v 的入点 , 最后跑一下最大流或者匈牙利 算出最大匹配(入点和出点间的匹配)。答案就是 点的数目 - 最大匹配数

证明:还没有匹配时,图中有n条路径(长度为0),多一组匹配图上就代表两个点可以直接相连,图中就会少一条路径。一个点的出点可以连向很多点的出点,但匈牙利算法可以帮助我们确定连向哪个点可以获得最大匹配。可以看例题再理解下。

题目1:https://vjudge.net/problem/HDU-1350-Taxi Cab Scheme

2、DAG的最小可相交路径覆盖
算法:先用floyd求出原图的传递闭包,即如果a到b有路径,那么就加边a->b。然后就转化成了最小不相交路径覆盖问题。

证明:为了连通两个点,某条路径可能经过其它路径的中间点。比如1->3->4,2->4->5。但是如果两个点a和b是连通的,只不过中间需要经过其它的点,那么可以在这两个点之间加边,那么a就可以直达b,不必经过中点的,那么就转化成了最小不相交路径覆盖。

二分图判定

判断二分图一般用——染色法:
1、任选一个点进行染色,并从这个点开始dfs;
2、与这个点相邻的点:(1)若还未染色,则标记为另一种颜色;(2)若已染色且颜色与当前点相同,则返回失败;(3)若已染色且颜色与当前点不同,则跳过此点
( 已被染色的点之前dfs过了)。

由染色法的过程可以得到一个定理:若一个无向图中有奇数环,那么它一定不是二分图,反之成立。

注:
若一个无向图中有奇数环,那么会出现染色相邻的情况。
在这里插入图片描述
奇数环:一个环中有奇数个点;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章