二分图相关

泳裤王子原创,转载请注明出处 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算法

【未完待续。。。】