Что-то не так с реализацией алгоритма Гейла Шепли

0

Я пытаюсь решить эту проблему на spoj, но постоянно получаю неправильный ответ. Я не понимаю, что случилось с моей c++ реализацией Gale - Shapley algorithm для Stable Marriage Problem " Stable Marriage Problem. Пожалуйста, проверьте мой код на некоторые логические ошибки.

Некоторые структуры данных, которые я использовал, это: 2d-массив "женщины" и "мужчины", содержащие порядки предпочтений, массив "m", так что m[i]=j означает, что человек я женат на женщине j, аналогично массив w 'такой, что w[i]=j означает, что женщина я замужем за мужчиной j, 2d array 'mrg', так что mrg[i][j]=1 означает, что я и j являются женатыми, 2d array 'pw' такие, что pw[i][j]=k означает, что man j имеет порядок предпочтения k в i-м списке женщин, аналогично 2d array 'pm', так что pm[i][j]=k означает, что женщина j имеет порядок предпочтений k в i-м списке человека. Пожалуйста, помогите мне.

#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
    учитывая стиль кода, я мог бы добавить тег C к этому.
  • 0
    спасибо за ваше предложение. Я думаю, вы правы.
Теги:
arrays
algorithm

1 ответ

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 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 итераций).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню