【二分图】二分图的多重匹配

Posted on 2018-05-09 16:14  som_nico  阅读(625)  评论(0编辑  收藏  举报

某些问题中,会遇到一对多的二分图模型,即允许集合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;
}