Я пытаюсь решить эту проблему на 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;
}
Вы точно не следуете алгоритму 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 итераций).