我正在尝试解决问题上的this problem,但不断得到错误的答案。我不明白c++
Gale - Shapley algorithm
对Stable Marriage Problem
的实施有什么问题。请检查我的代码是否有一些逻辑错误。
我使用的一些数据结构是:2d数组'women'和'men'包含首选项,数组'm'使得m[i]=j
意味着我与女人j结婚,类似数组w'这样w[i]=j
表示女人我与男人j结婚,2d数组'mrg',mrg[i][j]=1
表示我和j结婚,2d数组'pw'表示pw[i][j]=k
表示男人j有类似于2d数组'pm',pm[i][j]=k
表示女性j在我的男性列表中具有偏好顺序k。请帮帮我。
#include<cstdio>
#include<iostream>
using namespace std;
main() {
int t;
scanf("%d",&t);
while(t--) {
int n;
scanf("%d",&n);
int women[n+1][n+1],men[n+1][n+1];
int m[n+1],w[n+1],mrg[n+1][n+1],pw[n+1][n+1],pm[n+1][n+1];
for(int i=1;i<=n;++i) {
m[i]=0;
w[i]=0;
for(int j=1;j<=n;++j) {
mrg[i][j]=0;
pw[i][j]=pm[i][j]=0;
}
}
for(int i=1;i<=n;++i) {
int num;
scanf("%d",&num);
for(int j=1;j<=n;++j) {
scanf("%d",&women[num][j]);
pw[num][women[num][j]]=j;
}
}
for(int i=1;i<=n;++i) {
int num;
scanf("%d",&num);
for(int j=1;j<=n;++j) {
scanf("%d",&men[num][j]);
pm[num][men[num][j]]=j;
}
}
for(int i=1;i<=n;++i) {
for(int j=1;j<=n;++j) {
int pref=men[j][i];
if(m[j]==0) {
if(w[pref]==0) {
w[pref]=j;
mrg[j][pref]=1;
m[j]=pref;
}
else if(pw[pref][w[pref]]>pw[pref][j]) {
int oldhusband=w[pref];
m[oldhusband]=0;
mrg[oldhusband][pref]=0;
w[pref]=j;
mrg[j][pref]=1;
m[j]=pref;
}
}
else if(pm[j][pref]<pm[j][m[j]]) {
if(w[pref]==0) {
int oldwife=m[j];
w[oldwife]=0;
mrg[j][oldwife]=0;
m[j]=pref;
w[pref]=j;
mrg[j][pref]=1;
}
else if(pw[pref][w[pref]]>pw[pref][j]) {
int oldhusband=w[pref];
int oldwife=m[j];
m[oldhusband]=0;
w[oldwife]=0;
w[pref]=j;
m[j]=pref;
mrg[oldhusband][pref]=0;
mrg[j][oldwife]=0;
mrg[j][pref]=1;
}
}
}
}
for(int j=1;j<=n;++j)
cout<<j<<" "<<m[j]<<endl;
}
return 0;
}
答案 0 :(得分:1)
您没有完全遵循Gale Shapely算法。 http://en.wikipedia.org/wiki/Stable_marriage_problem
function stableMatching {
Initialize all m ∈ M and w ∈ W to free
while ∃ free man m who still has a woman w to propose to {
w = m's highest ranked such woman to whom he has not yet proposed
if w is free
(m, w) become engaged
else some pair (m', w) already exists
if w prefers m to m'
(m, w) become engaged
m' becomes free
else
(m', w) remain engaged
} }
如果你看一下上面提到的伪代码算法,你只需要改变一个女人的伴侣,如果一个更优先的男人向她求婚。
在你的情况下,如果他有更优先的伴侣,你也会试图改变一个订婚男人的伴侣。根据算法的想法,这种情况永远不会发生,因为该男子所从事的女性应始终优先于当前考虑的女性。因此删除这部分。
此外,男人的循环应该继续,直到所有男人都配对(不一定是n次迭代)。