1. 程式人生 > >【二分圖】二分圖的多重匹配

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

pat 元素 () pre AI find main 尋找 ++

某些問題中,會遇到一對多的二分圖模型,即允許集合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; }

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