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