二分图二分图的多重匹配

Posted som_nico

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分图二分图的多重匹配相关的知识,希望对你有一定的参考价值。

某些问题中,会遇到一对多的二分图模型,即允许集合Y中的一个元素和集合X中的多个元素匹配(通常有一个最大限制n)

/*二分图多重匹配算法*/
const int MAXN=1001;//最大顶点数
int bmap[MAXN][MAXN];//二分图
bool bmask[MAXN];//寻找增广路径是的标志数组
int nx,ny;//左右集合的顶点数目
int vcy[MAXN];//vcy[i],右集合i顶点匹配到左集合的顶点数目
int cy[MAXN][MAXN];//cy[i][j]右集合i顶点匹配的第j个元素
int limit;//每个右集合顶点最多匹配的左集合顶点个数
int left,right;//用于二分搜索
/*寻找增广路径*/
bool findpath(int u){
    int i,j;
    for(i=0;i<ny;i++){
        if(bmap[u][i]&&!bmask[i]){
            bmask[i]=1;
            if(vcy[i]<limit){
                cy[i][vcy[i]++]=u;
                return true;
            }
            for(j=0;j<vcy[i];j++){
                if(findpath(cy[i][j])){
                    cy[i][j]=u;
                    return true;
                }
            }
        }
    }
    return false;
}
/*求多重匹配*/
bool MulMath(){
    memset(vcy,0,sizof(vcy));
    for(int i=0;i<nx;i++){
        memset(bmask,0,sizof(bmask));
        if(!findpath(i)) return false;
    }
    return true;
}
int main(){
    /*coding*/
    left=0;
    right=nx;
    while(left<right){
        limit=(left+right)/2;
        if(MulMath) right=limit;
        else l=limit+1;
    }
    /*coding*/
    return 0;
}

 

以上是关于二分图二分图的多重匹配的主要内容,如果未能解决你的问题,请参考以下文章

hdu 3605 Escape 二分图的多重匹配(匈牙利算法)

hiho1393二分图多重匹配

POJ3189_Steady Cow Assignment(二分图多重匹配/网络流+二分构图)

POJ - 2289 Jamie's Contact Groups (二分图多重匹配)

[kuangbin带你飞]专题十 匹配问题 二分图多重匹配

POJ2584_T-Shirt Gumbo(二分图多重最大匹配/最大流)