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算法的伪代码:

 

posted @ 2020-06-22 01:45  NeoZy  阅读(808)  评论(0编辑  收藏  举报