今天上課研究生學長講了乙個問題,男女穩定匹配問題,作為乙隻單身狗覺得這個問題很有意思,下課就試著自己寫了下**。
現有n個男生與n個女生,一男一女配對,要求:
配對的男生與女生互相都是稱心的、中意的,且配偶中任乙個人都不能有其他彼此更中意的異性。即若給定(a,b)和(c,d)分別是兩對配偶,若a和d彼此的喜歡程度都大於自己的配偶(a對d的喜歡程度勝於對b,並且d對a的喜歡程度也勝於對c,這樣就會出現a與d私奔的情況),這樣是不存在的,也就是說,除了自己的配偶之外,沒有更適合的人了。
選擇方式:
男生選擇自己喜歡的女生並向其告白(有可能多個男生對乙個女),女生從對自己告白的男生裡面挑選自己最中意的男生作為配偶,被拒絕的男生對其他(排除拒絕自己的女生)女生按照喜歡度排序,並向最喜歡的那個女生告白,所有女生從對自己告白的男生裡面挑出最喜歡的一位作為配偶(包括上一步已經選過男生的女生,女生選擇時也要考慮上乙個選擇的男生的喜歡程度是否高於這一次對自己告白的男生)。迴圈上面的步驟,直到所有男生與女生都配對成功。
這樣說比較繞口,用**描述一下吧。
假設現在有3個男生(a,b,c)與3個女生(1,2,3)。
喜歡程度排序:
第一次男生選取時,挑選自己最中意的女生,a—2, b—1, c—1, 向女生告白。
女生從這些向自己告白的男生中選取自己喜歡程度較高的男生,1—c, 2—a,1女生有兩個男生向其告白(b和c),而1女生更喜歡c,所以選擇c男生。
b男生被拒絕,在自己的喜歡程度排序中將1排除。
第二次男生選取,a與c已經被選,只剩下b男生,b選擇2(因為1女生已經拒絕了b,所以排除1之後最中意的女生是2)。女生2原來選擇的b男生,但是在a和b之間,女生更喜歡b,所以拒絕a,選擇b。
男生a傷心地從排序中刪除了2。
第三次選取,只剩下a還沒有配偶,a按照排序選擇3,3沒有更多的選擇,就與a作為配偶。
這樣就完成了選取步驟。
以下是偽**
while(男生還有自由的,沒有配偶的)
else
else}}
光說沒有用,寫了下**。
給男生和女生分別設立結構體,
struct boys
;struct girls
;
那麼偽**可以進行修改:
for(int i 所有男生)
else
else
if(a==0)}}
配對的核心**
void couple()
else
else
if(a==0)}}
}
compared函式**
int compared(int a,int b,int
value) //比較男生a和b哪乙個在排序中靠前
return -1;
}
假設現有6個男生6個女生,先輸入每個男生的喜歡程度排序,再輸入每個女生的。
最終配對結果:1—6, 2—5, 3—4, 4—1, 5—3, 6—2 (先男生後女生)
穩定匹配問題
讀自 演算法設計 問題描述 在n個男人和n個女人之間進行匹配,使得匹配結果是穩定的,即假設存在m偏愛w而不偏愛w 存在w偏愛m,而不偏愛m 若存在 m,w 和 m w 屬於匹配結果s,由於m會掙脫w 去找w,w會掙脫m 去找m,所以該匹配結果是不穩定的。g s演算法如下 初始時所有的m m和w w都...
穩定匹配問題
完美匹配 假設有n個男人和n個女人,如果男人和女人匹配結成一對,是為完美匹配 不穩定匹配 假設有兩對夫婦 while 存在乙個男人m且還有他未求婚的婦人 else 已經和其他男人約會了 else 那麼如何證明這個演算法的有效性呢?一,證明其為完美匹配 用反證法,假如最後還余乙個單身男性,那麼自然以餘...
穩定匹配問題
問題描述如下 有n個男生和n個女生,找出一種穩定的匹配方式,滿足以下條件 1.每個男生能且只能匹配乙個女生。2.每個男生將所有女生排序形成乙個列表,從最喜歡到最不喜歡依次排列。3.每個女生將所有男生排序形成乙個列表,從最喜歡到最不喜歡依次排列。不穩定因素 如果在已經匹配好的方案中,存在某個男生,更喜...