二分图最大匹配--匈牙利算法

二分图是什么就不啰嗦了。

匈牙利算法的核心就是:不断地找一条增广路径(增广路的定义(也称增广轨或交错轨): 若P是图G中一条连通两个未匹配顶点的路径,并且属M的边和不属M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径。(M为一个匹配)),然后反转这条路径,则匹配的边就会增加1


C语言代码:

#include<stdio.h>
#include<string.h>
 
bool g[201][201];
int n,m,ans;
bool b[201];
int link[201];
 
bool init()
{
        int _x,_y;
        memset(g,0,sizeof(g));
        memset(link,0,sizeof(link));
        ans=0;
        if(scanf("%d%d",&n,&m)==EOF)return false;
        for(int i=1;i<=n;i++)
        {
                scanf("%d",&_x);
                for(int j=0;j<_x;j++)
                {
                        scanf("%d",&_y);
                        g[ i ][_y]=true;
                }
        }
        return true;
}
 
bool find(int a)
{
        for(int i=1;i<=m;i++)
        {
                if(g[a][ i ]==1&&!b[ i ])
                {
                        b[ i ]=true;
                        if(link[ i ]==0||find(link[ i ]))
                        {
                                link[ i ]=a;
                                return true;
                        }
                }
        }
        return false;
}
 
int main()
{
        while(init())
        {
                for(int i=1;i<=n;i++)
                {
                        memset(b,0,sizeof(b));
                        if(find(i))ans++;
                }
                printf("%d\n",ans);
        }
}


http://course.cug.edu.cn/21cn/%E7%A6%BB%E6%95%A3%E6%95%B0%E5%AD%A6%EF%BC%88%E5%8C%97%E5%A4%A7%EF%BC%89/part4/chapter18/18_03_02_01.htm

二、Hall定理

  定理18.5 ( Hall定理 )设二部图G=<V 1 ,V 2 ,E>中,|V 1 |≤|V 2 |. G中存在从V 1 到V 2 的完备匹配当且仅当V 1 中任意k(k=1,2,…, |V 1 |)个顶点至少与V 2 中的k个顶点相邻。

  本定理中的条件常称为“相异性条件”。

   定理的必要性显然。下面证明充分性,即证明只要满足相异性条件,G中最大匹配一定是完备匹配。设M为G中一个最大匹配。若M不是完备匹配,必存在vx∈V1为M的非饱和点。且必存在e∈E1=E-M与vx关联,否则vx将是孤立点,这与相异性条件矛盾。并且V2中与vx相邻的顶点都是M-饱和点,若存在vy∈V2 (与vx相邻)为非饱和点,则M'=M∪(vx,vy)也是匹配,这显然与M为最大匹配矛盾。考虑从vx出发的尽可能长的所有交错路径,由于M是最大匹配,又由定理18.4可知,这些交错路径都不是可增广的,即每条路径异于vx的端点一定是M-饱和点,于是这些端点全在V1中,令

    S={v|v∈V1且v在从vx出发的交错路径上}
    T={v|v∈V2且v在从vx出发的交错路径上}

由于各条交错路径的两个端点全在S中,所以|S|=|T|+1. 这正说明V 1 中|T|+1个顶点只与V 2 中|T|个顶点相邻,这矛盾于相异性条件,因而V 1 中不可能存在M-非饱和点,故M是完备匹配。

  图18.4(3)中,存在着V1中的两个顶点只与V2中的一个顶点相邻,因而不满足相异性条件,于是(3)中不存在完备匹配。而(1),(2)均满足相异性条件,因而都存在完备匹配。

  由定理18.5还可以得出下面定理。

 定理18.6 设二部图G=<V1,V2,E>中,V1中每个顶点至少关联t(t≥1)条边,而V2中每个顶点至多关联t条边,则G中存在V1到V2的完备匹配。

   由定理中的条件可知,V1中任意k(1≤k≤|V1|)个顶点至少关联kt条边,而因为V2中每个顶点至多关联t条边,所以这kt条边至少关联V2中k个顶点,这正说明G满足相异性条件,因而G中存在完备匹配。

  常称定理18.6中的条件为t条件。图18.4中,(2)满足t=2的t条件,当然存在完备匹配,而在(1)中不满足t条件,但因它满足相异性条件,所以才存在完备匹配。


你可能感兴趣的:(c,算法,语言)