穩定婚姻問題:有n個男人,n個女人。每個人都有乙個對異性的排名(1~n),假設男人主動追求女人,根據這些排名,我們需要將這些男女進行牽線,使得他們的婚姻穩定。
由於穩定不太好定義,我們定義一下不穩定。
不穩定婚姻:對於任意乙個男人m, 假設其當前配偶為w, 若存在乙個女人w1, 其當前配偶為m1, 她在m 的排名中比w靠前,同時,m在w1的排名中比她現任丈夫m1靠前,這時候我們稱婚姻(m, w)為不穩定婚姻。
整個男女集合中不存在不穩定婚姻則這個集合為穩定婚姻集合。
那麼,如何找到穩定婚姻呢? 演算法步驟:
從第乙個男人開始,找到其排名中最高的女人,
若這個女人單身,則
兩人結合
否則若當前男人在這個女人的排名比其現任丈夫高,則
則當前男人與這個女人結合。這個女人原丈夫變為單身。
直到所有男人都找到配偶演算法結束。
poj 3487是一道穩定婚姻的入門題。因為需要處理的是字串,所有這道題的儲存結構稍微有點麻煩,用了兩次雜湊。
#include#include#include#include#includeusing namespace std;
const int n = 32;
typedef vector::iterator vc_i;
char male[n];
char female[n];
char in[128];
int hs[256];
int nhs[256];
int matched[256];
queueque;
vectorg[n<<1];
int getlev(int f, char m)
return ret;
}int main()
for(int i = 0; i < n; i++)
int num = 0;
for(int i = 0; i < n; i++)
for(; j < len; j++)
g[hs[in[0]]].push_back(in[j]);
que.push(i);
}for(int i = 0; i < n; i++)
for(; j < len; j++)
g[hs[in[0]]].push_back(in[j]);
}while(!que.empty())
else}}
}// sort(nhs, nhs + n); //根據題意是需要排序的,但沒排序也過了。
for(int i = 0; i < n; i++)
printf("%c %c\n", nhs[i], nhs[matched[i]]);
puts("");
}return 0;
}
poj3487 穩定婚姻問題
穩定婚姻問題,雖然簡單,但是挺有意思的。poj3487中要注意,這道題中的字母並不是一定要從a開始連續的,注意哦。include include include includeusing namespace std char male 26 char female 26 int n int t in...
穩定婚姻問題
穩定婚姻是組合數學裡面的乙個問題。問題大概是這樣 有乙個社團裡有n個女生和n個男生,每位女生按照她的偏愛程度將男生排序,同時每位男生也按照自己的偏愛程度將女生排序。然後將這n個女生和n個男生配成完備婚姻。如果存在兩位女生a和b,兩位男生a和b,使得a和a結婚,b和b結婚,但是a更偏愛b而不是a,b更...
穩定婚姻問題
著名的穩定婚姻問題是美國數學家 經濟學家lloyd stowell shapley 1923 提出的。下面介紹一下背景 某單位有n個姑娘w1,w2,wn和n個小伙m1,m2 mn。每位姑娘對所有小伙有乙個滿意度排序,每位小伙對所有姑娘也有一滿意度排序。m1 w2 w1 w3 w1 m1 m3 m2 ...