Gale-Shplay算法(约会匹配问题)
1 int womanPrefer[10][10],manPrefer[10][10]; 2 //womanPrefer[i][j]:i号女人第j喜欢的男人编号 3 //manPrefer[i][j]:i号男人第j喜欢的女人编号 4 vector<int>& GaleShplay(){ 5 int DatedMan=0;//已经脱单的男人 6 int womanDated[10]={0};//womanDated[i]:第i个女人约会的对象(如果还没有对象默认是-1) 7 int manDated[10]={0};//manDated[i]:第i个男人约会的对象(如果还没有对象默认是-1) 8 for(int i=0;i<10;++i){ 9 womanDated[i]=-1; 10 manDated[i]=-1; 11 } 12 int womanPreferManNumber[10][10];//womanPreferManNumber[i][j]:i号女人对j号男人的排名(即i号女人喜欢的所有男人中,j号男人排名 13 //womanPreferManNumber[i][j]位) 14 for(int i=0;i<10;++i){ 15 for(int j=0;j<10;++j){ 16 womanPreferManNumber[i][womanPrefer[i][j]]=j; 17 } 18 } 19 for(int i=0;i<10;++i){ 20 //第i轮内让所有男人对各自第i喜欢的女人告白,如果被告白的女人还没有对象就接受;否则将其与已有的约会对象做比较, 21 //如果女人更喜欢新对象,则劈腿;不然则保持原约会关系 22 for(int j=0;j<10;++j){ 23 if(manDated[j]!=-1){ //已经约会的男人直接跳过 24 continue; 25 } 26 int likedWoman=manPrefer[j][i]; //j号男人第i喜欢的女人 27 if(womanDated[likedWoman]==-1){//该女人还没有对象 28 DatedMan+=1; 29 womanDated[likedWoman]=j; //likedWoman和j进行约会 30 manDated[j]=likedWoman; //likedWoman和j进行约会 31 } 32 else{//该女人已经有对象,则进行比较 33 int existedDatedMan=womanDated[likedWoman]; //该女人正在约会的男人编号 34 if(womanPreferManNumber[existedDatedMan]>womanPreferManNumber[j]){//女人更喜欢j(womanPreferManNumber值小的说明排名靠前) 35 int lvmaozi=womanDated[likedWoman];//前男友 36 womanDated[likedWoman]=j;//劈腿 37 manDated[j]=likedWoman;//劈腿 38 manDated[lvmaozi]=-1; //被绿 39 } 40 } 41 } 42 if(DatedMan>=10){ //都有对象了就退出 43 break; 44 } 45 } 46 }
注意上述代码未经过验证!
Gale-Shplay算法的伪代码:
进击的小🐴农