stable marriage problem
稳定婚姻问题学习笔记
问题阐述
给定
性质
稳定婚姻匹配一定存在,不一定唯一。
算法
Mating Ritual 算法
早上:男性找到自己最喜欢的女性,给她唱歌
中午:女性如果有很多男的给她唱歌,选自己最喜欢的,然后让别的走
晚上:男的再也不去给那个拒绝他的女的唱歌
如此重复最多
/*
实际代码跟算法有出入,一次只计算一个男人,编码方便,原理一致
*/
int wp[210],mp[210];//女/男人匹配的
int p1[210][210],q1[210][210];
int p2[210][210],q2[210][210];
// 优先级越大表排名越靠前 p1 代表男人对女人 p2 代表女人对男人 q1,q2为这个人所对应优先级
void stable_marriage(){
for(int i=1;i<=n;++i)mp[i]=wp[i]=0;
int cnt=n;
while(cnt>0){
int m=1;
while(mp[m]>0)m++;
assert(m<=n);
for(int i=1;i<=n;++i){
int w=p1[m][i];
if(wp[w]==0){
mp[m]=w;
wp[w]=m;
cnt--;
break;
}else if(q2[w][m]<q2[w][wp[w]]){
mp[wp[w]]=0;
wp[w]=m;
mp[m]=w;
break;
}
}
}
}
算法趣谈
看似女性充满了主动权,实则男性收获最大。
这个算法得到的男性对应的女性,是可能女性里偏好度最大的。女性对应的男性,是可能男性里偏好都最小的。
反直觉的事实。
参考资料
本文作者:⅔钱强
本文链接:https://www.cnblogs.com/life-of-a-libertine/p/18537273
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步