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算法的偽代碼: