Gale Shapley算法实现有问题

时间:2013-12-26 09:07:30

标签: c++ arrays algorithm

我正在尝试解决问题上的this problem,但不断得到错误的答案。我不明白c++ Gale - Shapley algorithmStable 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;
}

1 个答案:

答案 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次迭代)。