日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hdu - 1435 Stable Match 稳定婚姻问题、Gale-Shapley算法模板

發(fā)布時(shí)間:2024/3/13 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu - 1435 Stable Match 稳定婚姻问题、Gale-Shapley算法模板 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

穩(wěn)定婚姻的描述:? ? ? ??

? ? ? ? 假如你是一個(gè)媒人,有若干個(gè)單身男子登門求助,還有同樣多的單身女子也前來征婚。如果你已經(jīng)知道這些女孩兒在每個(gè)男孩兒心目中的排名,以及男孩兒們?cè)诿總€(gè)女孩兒心中的排名,你應(yīng)該怎樣為他們牽線配對(duì)呢?

? ? ? ? 最好的配對(duì)方案當(dāng)然是,每個(gè)人的另一半正好都是自己的“第一選擇”。這雖然很完美,但絕大多數(shù)情況下都不可能實(shí)現(xiàn)。比方說,男1號(hào)最喜歡的是女1號(hào),而女1號(hào)的最愛不是男1號(hào),這兩個(gè)人的最佳選擇就不可能被同時(shí)滿足。如果好幾個(gè)男孩兒最喜歡的都是同一個(gè)女孩兒,這幾個(gè)男孩兒的首選也不會(huì)同時(shí)得到滿足。當(dāng)這種最為理想的配對(duì)方案無法實(shí)現(xiàn)時(shí),怎樣的配對(duì)方案才能令人滿意呢?

? ? ? ? 其實(shí),找的對(duì)象太完美不見得是好事兒,和諧才是婚姻的關(guān)鍵。如果男1號(hào)和女1號(hào)各有各的對(duì)象,但男1號(hào)覺得,比起自己現(xiàn)在的,女1號(hào)更好一些;女1號(hào)也發(fā)現(xiàn),在自己心目中,男1號(hào)的排名比現(xiàn)男友更靠前。這樣一來,這兩人就可能拋棄各自現(xiàn)在的對(duì)象——如果出現(xiàn)了這種情況,我們就說婚姻搭配是不穩(wěn)定的。作為一個(gè)紅娘,你深知,對(duì)象介紹得不好沒關(guān)系,就怕婚姻關(guān)系不穩(wěn)定。給客戶牽線配對(duì)時(shí),雖然不能讓每個(gè)人都得到最滿意的,但搭配必須得穩(wěn)定。換句話說,對(duì)于每一個(gè)人,在他心目中比他當(dāng)前伴侶更好的異性,都不會(huì)認(rèn)為他也是一個(gè)更好的選擇。現(xiàn)在,我們的問題是:穩(wěn)定的婚姻搭配總是存在嗎?應(yīng)該怎樣尋找?

? ? ? ? 可能很多人會(huì)立即想到一種尋找穩(wěn)定婚姻搭配的策略:不斷修補(bǔ)當(dāng)前搭配方案。如果兩個(gè)人互相都覺得對(duì)方比自己當(dāng)前的伴侶更好,就讓這兩個(gè)人成為一對(duì),剩下被甩的那兩個(gè)人組成一對(duì)。如果還有想要私奔的男女對(duì),就繼續(xù)按照他們的愿望對(duì)換情侶,直到最終消除所有的不穩(wěn)定組合。容易看出,應(yīng)用這種“修補(bǔ)策略”所得到的最終結(jié)果一定滿足穩(wěn)定性,但這種策略的問題在于,它不一定存在“最終結(jié)果”。事實(shí)上,按照上述方法反復(fù)調(diào)整搭配方案,最終可能會(huì)陷入一個(gè)死循環(huán),因此該策略甚至不能保證得出一個(gè)確定的方案來。

GS算法過程:

? ? ? ? 1962年,美國(guó)數(shù)學(xué)家David Gale和Lloyd Shapley發(fā)明了一種尋找穩(wěn)定婚姻的策略。不管男女各有多少人,也不管他們的偏好如何,應(yīng)用這種策略后總能得到一個(gè)穩(wěn)定的搭配。換句話說,他們證明了穩(wěn)定的婚姻搭配總是存在的。有趣的是,這種策略反映了現(xiàn)實(shí)生活中的很多真實(shí)情況。

? ? ? ? 在這種策略中,男孩兒將一輪一輪地去追求他中意的女子,女子可以選擇接受或者拒絕他的追求者。第一輪,每個(gè)男孩兒都選擇自己名單上排在首位的女孩兒,并向她表白。此時(shí),一個(gè)女孩兒可能面對(duì)的情況有三種:沒有人跟她表白,只有一個(gè)人跟她表白,有不止一個(gè)人跟她表白。在第一種情況下,這個(gè)女孩兒什么都不用做,只需要繼續(xù)等待;在第二種情況下,接受那個(gè)人的表白,答應(yīng)暫時(shí)和他做情侶;在第三種情況下,從所有追求者中選擇自己最中意的那一位,答應(yīng)和他暫時(shí)做情侶,并拒絕所有其他追求者。

? ? ? ? 第一輪結(jié)束后,有些男孩兒已經(jīng)有女朋友了,有些男孩兒仍然是單身。在第二輪追女行動(dòng)中,每個(gè)單身男孩兒都從所有還沒拒絕過他的女孩兒中選出自己最中意的那一個(gè),并向她表白,不管她現(xiàn)在是否是單身。和第一輪一樣,女孩兒們需要從表白者中選擇最中意的一位,拒絕其他追求者。注意,如果這個(gè)女孩兒已經(jīng)有男朋友了,當(dāng)她遇到了更好的追求者時(shí),她必須拒絕掉現(xiàn)在的男友,投向新的追求者的懷抱。這樣,一些單身男孩兒將會(huì)得到女友,那些已經(jīng)有了女友的人也可能重新變成光棍。在以后的每一輪中,單身男孩兒繼續(xù)追求列表中的下一個(gè)女孩兒,女孩兒則從包括現(xiàn)男友在內(nèi)的所有追求者中選擇最好的一個(gè),并對(duì)其他人說不。這樣一輪一輪地進(jìn)行下去,直到某個(gè)時(shí)候所有人都不再單身,下一輪將不會(huì)有任何新的表白發(fā)生,整個(gè)過程自動(dòng)結(jié)束。此時(shí)的婚姻搭配就一定是穩(wěn)定的了。

? ? ? ? 這個(gè)策略會(huì)不會(huì)像之前的修補(bǔ)法一樣,出現(xiàn)永遠(yuǎn)也無法終止的情況呢?不會(huì)。下面我們將說明,隨著輪數(shù)的增加,總有一個(gè)時(shí)候所有人都能配對(duì)。由于在每一輪中,至少會(huì)有一個(gè)男孩兒向某個(gè)女孩兒告白,因此總的告白次數(shù)將隨著輪數(shù)的增加而增加。倘若整個(gè)流程一直沒有因所有人都配上對(duì)了而結(jié)束,最終必然會(huì)出現(xiàn)某個(gè)男孩兒追遍了所有女孩兒的情況。而一個(gè)女孩兒只要被人追過一次,以后就不可能再單身了。既然所有女孩兒都被這個(gè)男孩兒追過,就說明所有女孩兒現(xiàn)在都不是單身,也就是說此時(shí)所有人都已配對(duì)。

? ? ? ? 接下來,我們還需要證明,這樣得出的配對(duì)方案確實(shí)是穩(wěn)定的。首先注意到,隨著輪數(shù)的增加,一個(gè)男孩兒追求的對(duì)象總是越來越糟,而一個(gè)女孩兒的男友只可能變得越來越好。假設(shè)男A和女1各自有各自的對(duì)象,但比起現(xiàn)在的對(duì)象,男A更喜歡女1。因此,男A之前肯定已經(jīng)跟女1表白過。既然女1最后沒有跟男A在一起,說明女1拒絕了男A,也就是說她有了比男A更好的男孩兒。這就證明了,兩個(gè)人雖然不是一對(duì),但都覺得對(duì)方比自己現(xiàn)在的伴侶好,這樣的情況絕不可能發(fā)生。

? ? ? ? 我們把用來解決某種問題的一個(gè)策略,或者說一個(gè)方案,或者說一個(gè)處理過程,或者說一系列操作規(guī)則,或者更貼切地說,一套計(jì)算方法,叫做“算法”。上面這個(gè)用來尋找穩(wěn)定婚姻的策略就叫做“Gale-Shapley算法”,有些人也管它叫“延遲認(rèn)可算法”。

? ? ? ? 每個(gè)算法都有它的實(shí)際意義,能給我們帶來很多啟發(fā)。Gale-Shapley算法最大的意義就在于,作為一個(gè)為這些男女牽線的媒人,你并不需要親自計(jì)算穩(wěn)定婚姻匹配,甚至根本不需要了解每個(gè)人的偏好,只需要按照這個(gè)算法組織一個(gè)男女配對(duì)活動(dòng)就可以了。你需要做的僅僅是把算法流程當(dāng)作游戲規(guī)則告訴大家,游戲結(jié)束后會(huì)自動(dòng)得到一個(gè)大家都滿意的婚姻匹配。整個(gè)算法可以簡(jiǎn)單地描述為:每個(gè)人都去做自己想做的事情。對(duì)于男性來說,從最喜歡的女孩兒開始追起是順理成章的事;對(duì)于女性來說,不斷選擇最好的男孩兒也正好符合她的利益。因此,大家會(huì)自動(dòng)遵守游戲規(guī)則,不用擔(dān)心有人虛報(bào)自己的偏好。

? ? ? ? ?歷史上,這樣的“配對(duì)游戲”還真有過實(shí)際應(yīng)用,并且更有意思的是,這個(gè)算法的應(yīng)用居然比算法本身的提出還早10年。早在1952年,美國(guó)就開始用這種辦法給醫(yī)學(xué)院的學(xué)生安排工作,這被稱之為“全國(guó)住院醫(yī)師配對(duì)項(xiàng)目”。配對(duì)的基本流程就是,各醫(yī)院從尚未拒絕這一職位的醫(yī)學(xué)院學(xué)生中選出最佳人選并發(fā)送聘用通知,當(dāng)學(xué)生收到來自各醫(yī)院的聘用通知后,系統(tǒng)會(huì)根據(jù)他所填寫的意愿表自動(dòng)將其分配到意愿最高的職位,并拒絕掉其他的職位。如此反復(fù),直到每個(gè)學(xué)生都分配到了工作。那時(shí)人們并不知道這樣的流程可以保證工作分配的穩(wěn)定性,只是憑直覺認(rèn)為這是很合理的。直到10年之后,Gale和Shapley才系統(tǒng)地研究了這個(gè)流程,提出了穩(wěn)定婚姻問題,并證明了這個(gè)算法的正確性。

? ? ? ? 這個(gè)算法還有很多有趣的性質(zhì)。比如說,大家可能會(huì)想,這種男追女女拒男的方案對(duì)男性更有利還是對(duì)女性更有利呢?答案是,這種方案對(duì)男性更有利。事實(shí)上,穩(wěn)定婚姻搭配往往不止一種,然而上述算法的結(jié)果可以保證,每一位男性得到的伴侶都是所有可能的穩(wěn)定婚姻搭配方案中最理想的,同時(shí)每一位女性得到的伴侶都是所有可能的穩(wěn)定婚姻搭配方案中最差的。受篇幅限制,我們略去證明的過程。

? ? ? ? 這個(gè)算法會(huì)有一些潛在的問題。剛才我們已經(jīng)說了,對(duì)于每位女性來說,得到的結(jié)果都是所有可能的穩(wěn)定搭配中最差的一種。此時(shí),倘若有某位女性知道所有其他人的偏好列表,經(jīng)過精心計(jì)算,她有可能發(fā)現(xiàn),故意拒絕掉本不該拒絕的人(暫時(shí)保留一個(gè)較差的人在身邊),或許有機(jī)會(huì)等來更好的結(jié)果。因而,在實(shí)際生活中應(yīng)用這種算法,不得不考慮一些可能的欺詐與博弈。

? ? ? ? 這個(gè)算法還有一些局限。例如,它無法處理2n個(gè)人不分男女的穩(wěn)定搭配問題。一個(gè)簡(jiǎn)單的應(yīng)用場(chǎng)景便是宿舍分配問題:假設(shè)每個(gè)宿舍住兩個(gè)人,已知2n個(gè)學(xué)生中每一個(gè)學(xué)生對(duì)其余2n-1個(gè)學(xué)生的偏好評(píng)價(jià),如何尋找一個(gè)穩(wěn)定的宿舍分配?此時(shí),Gale-Shapley算法就不再有用武之地了。而事實(shí)上,宿舍分配問題中很可能根本就不存在穩(wěn)定的搭配。例如,有A、B、C、D四個(gè)人,其中A把B排在第一,B把C排在第一,C把A排在第一,而且他們?nèi)硕及袲排在最后。容易看出,此時(shí)一定不存在穩(wěn)定的宿舍分配方案。倘若A、D同宿舍,B、C同宿舍,那么C會(huì)認(rèn)為A是更好的室友(因?yàn)镃把A排在了第一),同時(shí)A會(huì)認(rèn)為C是更好的室友(因?yàn)樗袲排在了最后)。同理,B、D同宿舍或者C、D同宿舍也都是不行的,因而穩(wěn)定的宿舍分配是不存在的。此時(shí),重新定義宿舍分配的優(yōu)劣性便是一個(gè)更為基本的問題。

? ? ? ? 穩(wěn)定婚姻問題還有很多其他的變種,有些問題甚至是NP完全問題,至今仍然沒有(也不大可能有)一種有效的算法。在圖論、算法和博弈論中,這都是非常有趣的話題。

?


?

?中文題,就不說題意了,和穩(wěn)定婚姻問題一樣

鏈接hdu - 1435

穩(wěn)定婚姻模板(此題代碼):

#include <iostream> #include <algorithm> #include <cstdio> #include <cmath> #include <cstring> #include <string> #include <set> #include <map> #include <stack> #include <queue> #define inf 0x3f3f3f3fusing namespace std;const int maxn = 200 + 5;int B_g[maxn][maxn], G_b_score[maxn][maxn];//男生追求的順序 && 女生對(duì)男生的評(píng)價(jià) int bg[maxn], gb[maxn];// bg:boy -> girl && gb:girl -> boy bool mark[maxn][maxn];//男生是否追求過這個(gè)女生 int n;struct node {int num, v;double x, y, z; }node1[maxn], node2[maxn];struct nodee {double dis;int id, v; }fz[maxn];bool cmp(nodee a, nodee b) {if(a.dis == b.dis)return a.v > b.v;return a.dis < b.dis; }double Dis(node a, node b) {double x = a.x - b.x;double y = a.y - b.y;double z = a.z - b.z;return sqrt(x * x + y * y + z * z); }void stable_marry() {memset(mark, false, sizeof(mark));memset(bg, -1, sizeof(bg));memset(gb, -1, sizeof(gb));queue<int> q;while(!q.empty())q.pop();for(int i = 1; i <= n; i++) {q.push(i);}int head, nxt;while(!q.empty()) {head = q.front();q.pop();for(int i = 1; i <= n; i++) {int nxt = B_g[head][i];if(mark[head][nxt]) //男生追求過這個(gè)女生continue;mark[head][nxt] = 1;if(gb[nxt] == -1) { //女生還沒有男朋友gb[nxt] = head;bg[head] = nxt;break;}else if(G_b_score[nxt][gb[nxt]] < G_b_score[nxt][head]) { //女生對(duì)追求者的評(píng)價(jià)比現(xiàn)男友高q.push(gb[nxt]);gb[nxt] = head;bg[head] = nxt;break;}}} } int main() {int t;scanf("%d", &t);while(t--) {scanf("%d", &n);for(int i = 1; i<= n; i++) {scanf("%d %d %lf %lf %lf", &node1[i].num, &node1[i].v, &node1[i].x, &node1[i].y, &node1[i].z);}for(int i = 1; i <= n; i++) {scanf("%d %d %lf %lf %lf", &node2[i].num, &node2[i].v, &node2[i].x, &node2[i].y, &node2[i].z);}for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {fz[j].dis = Dis(node1[i], node2[j]);fz[j].id = j;fz[j].v = node2[j].v;}sort(fz + 1, fz + n + 1, cmp);for(int j = 1; j <= n; j++)B_g[i][j] = fz[j].id; //第i個(gè)男生追求女生的順序}for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {fz[j].dis = Dis(node2[i], node1[j]);fz[j].id = j;fz[j].v = node1[j].v;}sort(fz + 1, fz + n + 1, cmp);for(int j = 1; j <= n; j++)G_b_score[i][fz[j].id] = n - j + 1; //第i個(gè)女生對(duì)男生的評(píng)價(jià)}stable_marry();for(int i = 1; i <= n; i++) {printf("%d %d\n", node1[i].num, node2[bg[i]].num);}printf("\n");}return 0; }

?

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的hdu - 1435 Stable Match 稳定婚姻问题、Gale-Shapley算法模板的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。