二分图相关
泳裤王子原创,转载请注明出处 http://blog.csdn.net/tclh123/article/details/6696815
二分图G
顶点集分成 U、V 互不相交。
边集E = (U,V)
匹配M
子图M (<G)
M边集{E}无覆盖同一顶点的两条边
最大匹配
边数最大的M
完全匹配
M覆盖G.{V}
增广路P(交错轨)
P连通G中两个未盖点。
P上已匹配、未匹配边交替。
匈牙利算法(利用增广路)
思路:
(1) 置M为空
(2) 找增广路P,对P取反更新M。
(3) 重复(2)直到找不到增广路。
实现:
dfs(u)找增广路,每次都从U集合开始。
vis[i],每次dfs的访问标记,每次dfs前清零。
flag[v],对于V集合的U集合映射(匹配边)。
未盖点v,flag[v] = 0;
已盖点v,flag[v] = u;
//从U集合出发找增广路的伪代码,找到return true
Dfs(u)
Each (u,v)
If v not visited
Visit=1
If flag[v]=NOTCOVERor dfs(flag[v])=TRUE
Flag[v] = u
Return TRUE
Return FALSE
二分图的最小覆盖数(也称最小顶点覆盖)
边被覆盖,当且仅当它有至少一个关联点。
最小覆盖数即最少的顶点数使每条边都被覆盖。
实例:男生为U,女生为V,(u,v)表示二者可能会早恋,求最少需要开除几个童鞋才能
保证没人会早恋。(某人:太残忍了…..)
结论:二分图最小覆盖数=最大匹配数M。
简证:最大匹配中没有两条边有共同的关联点,每条边被一个点覆盖即可。
DAG的最小路径覆盖
用尽量少的不相交路径覆盖有向无环图G的所有顶点。
预备知识:一个n个结点的有向图(称n*n)中,路径覆盖就是在途中找一些路径,使之覆盖了图中所有结点,且任何一个顶点有且只有一条路径与之关联,(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一次。即除了路径的起点终点,点的入度和出度都为1);如果不考虑图中存在回路,那么每条路径就是一个弱连通子集。
最小路径覆盖就是找出最小的路径条数,使之成为G的一个路径覆盖。
思路:建立二分图模型,把所有顶点i拆成两个,分别属于U、V。
结论:最小路径覆盖数 = 结点数n - 最大匹配数M
简证:首先,最小路径覆盖跟最大匹配是在相同的状态取到的!
1、 一个匹配正好满足“任何一个顶点有且只有一条关联边”。
2、 一个匹配对应一种路径覆盖(假设盖所有的点),满足
结点数n - 匹配数M = 路径数,因为一条路径只有起点没有它的前驱,除了一条路径的起点,其他点都可以在匹配M中找到它相应的边作为前驱。即n-M就是路径起点的个数。
3、当匹配数最大,则路径数最小。
二分图的最大独立集
独立集是G的顶点集的子集,其中的点两两不邻接。
所以不是只有二分图才有最大独立集,但是一般都可以构造二分图来解,如每个点都拆成两个点分别加入X、Y。(还没有深究~)
结论:二分图G的最大独立集U = 二分图G的顶点集V(即X+Y) -最大匹配边集M,
即 |U| = |V| - |M|,
即 |U| + |M| = |X| + |Y|.
简证:
1、 总可以在M中每条边上各取一个点,将它们加入到未匹配点的集合后得到的是独立集。即|U| >= |V| - |EM|(M覆盖的点集) + |M| = |V| - |M|。
2、 U中任两点之间无边,所以M中每条边的两端不可能都在U中,即
|M| <= |V| - |U|。
实例:男生为U,女生为V,(u,v)表示二者可能会早恋,求最多能让几个童鞋在一起且保证不会发生早恋情况?(某人:是不是觉得跟上面那道最小点覆盖的题很像?发现它们的联系了吧…..)。 所以同样可以理解为,最大独立集U=顶点集V-最小点覆盖
例题:HDOJ_1068 Girls and Boys[link]
带权二分图的最佳匹配
KM算法
【未完待续。。。】