LA3989女士的选择
生活随笔
收集整理的這篇文章主要介紹了
LA3989女士的选择
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
? ? ? 給你n個(gè)男士n個(gè)女士,然后給你每個(gè)男士中女士的排名,和每個(gè)女士中每個(gè)男士在他們心中的排名,問(wèn)你是否可以組成穩(wěn)定的舞伴,如果存在以下情況(1)男生u和女生v不是舞伴,他們喜歡對(duì)方的程度都大于各自當(dāng)前舞伴的程度,他們就可能拋棄自己現(xiàn)在的舞伴,這樣的話匹配就不是穩(wěn)定的。輸出穩(wěn)定的時(shí)候每個(gè)男生所匹配的女生。
思路:
? ? ? 哎!本來(lái)就是一個(gè)最基本的穩(wěn)定婚姻問(wèn)題,輸入輸出的地方被白書(shū)翻譯出翔了,我C,弄的我怎么敲都過(guò)不去,后來(lái)看了下白書(shū)的代碼發(fā)現(xiàn)他是先輸出男生心目中女生的排名,而他前面說(shuō)的卻不是這個(gè),改了之后還是不過(guò),后來(lái)又接著往下看,發(fā)現(xiàn)輸出的是男生的結(jié)果,不是女生,就是一個(gè)輸入輸出整的調(diào)了好久,本來(lái)我的模板就是我自己寫(xiě)的,還以為是自己的模板寫(xiě)錯(cuò)了。
上面說(shuō)了那么多廢話,下面來(lái)說(shuō)下穩(wěn)定婚姻問(wèn)題的思想吧,首先穩(wěn)定婚姻問(wèn)題是必然有唯一解的,至于為什么,這個(gè)可以去網(wǎng)上找詳細(xì)證明,如果不想證明,我們可以想一下每個(gè)人心中都對(duì)所有人排名了,如果剩下一個(gè)女生,那么必定會(huì)剩下一個(gè)男生,所謂剩下的就是他們不能再追求得上自己更喜歡的了,最后就剩他兩個(gè)了,直接匹配上也是穩(wěn)定的。對(duì)于算法的過(guò)程是這樣的,我們先把所有男生都扔進(jìn)隊(duì)列,隊(duì)列里的就表示當(dāng)前沒(méi)有找到對(duì)象的男生,然后男生一個(gè)一個(gè)的從隊(duì)列出來(lái),出來(lái)后從自己最喜歡的女生開(kāi)始一個(gè)一個(gè)訪問(wèn),如果這個(gè)女生當(dāng)前沒(méi)有對(duì)象,那么直接匹配上,如果有的話就看看是不是自己在那個(gè)女生心中的地位比她當(dāng)前的對(duì)象好,如果好,那么直接匹配,那個(gè)女生之前的對(duì)象將被扔回單身隊(duì)列,就這樣一直到單身隊(duì)列為空就完事了,算法整體上看感覺(jué)男生很可憐,很容易被女生直接扔回去,其實(shí)女生更可憐,沒(méi)有自己的主動(dòng)權(quán),只能是等著選他的男生中選一個(gè)最好的,自己最喜歡的男生可能永遠(yuǎn)不會(huì)去選擇他,呵呵,感覺(jué)算法比較搞笑....
#include<stdio.h>
#include<string.h>
#include<queue>
#define N 1000 + 10
using namespace std;
int map[N][N] ,sc[N][N];
int mark[N][N];
int nowb[N] ,nowg[N];
void Marry(int n)
{
? ?queue<int>q;
? ?for(int i = 1 ;i <= n ;i++)?
? ?q.push(i);
? ?memset(nowb ,255 ,sizeof(nowb));
? ?memset(nowg ,255 ,sizeof(nowg));
? ?memset(mark ,0 ,sizeof(mark));
? ?while(!q.empty())
? ?{
? ? ? int xin ,tou;
? ? ? tou = q.front();
? ? ? q.pop();
? ? ? for(int i = 1 ;i <= n ;i ++)
? ? ? {
? ? ? ? ?xin = map[tou][i];
? ? ? ? ?if(mark[tou][xin]) continue;
? ? ? ? ?mark[tou][xin] = 1;
? ? ? ? ?if(nowg[xin] == -1)
? ? ? ? ?{
? ? ? ? ? ? ?nowg[xin] = tou;
? ? ? ? ? ? ?nowb[tou] = xin;
? ? ? ? ? ? ?break;
? ? ? ? ?}
? ? ? ? ?else if(sc[xin][tou] > sc[xin][nowg[xin]])
? ? ? ? ?{
? ? ? ? ? ? ?q.push(nowg[xin]);
? ? ? ? ? ? ?nowg[xin] = tou;
? ? ? ? ? ? ?nowb[tou] = xin;
? ? ? ? ? ? ?break;
? ? ? ? ?}
? ? ? ?}
? ?}
}
?
int main ()
{
? ? int t ,n ,i ,j ,a;
? ? scanf("%d" ,&t);
? ? while(t--)
? ? {
? ? ? ? scanf("%d" ,&n);
? ? ? ? for(i = 1 ;i <= n ;i ++)
? ? ? ? for(j = 1 ;j <= n ;j ++)
? ? ? ? scanf("%d" ,&map[i][j]);?
? ? ? ? for(i = 1 ;i <= n ;i ++)
? ? ? ? {
? ? ? ? ? ?for(j = 1 ;j <= n ;j ++)
? ? ? ? ? ?{
? ? ? ? ? ? ? scanf("%d" ,&a);
? ? ? ? ? ? ? sc[i][a] = n - j + 1;
? ? ? ? ? ?}
? ? ? ? }
? ? ? ? Marry(n);
? ? ? ? for(i = 1 ;i <= n ;i ++)
? ? ? ? printf("%d\n" ,nowb[i]);
? ? ? ? if(t) puts("");
? ? }
? ? return 0;
} ? ? ??
? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
? ? ? ? ??
? ? ? 給你n個(gè)男士n個(gè)女士,然后給你每個(gè)男士中女士的排名,和每個(gè)女士中每個(gè)男士在他們心中的排名,問(wèn)你是否可以組成穩(wěn)定的舞伴,如果存在以下情況(1)男生u和女生v不是舞伴,他們喜歡對(duì)方的程度都大于各自當(dāng)前舞伴的程度,他們就可能拋棄自己現(xiàn)在的舞伴,這樣的話匹配就不是穩(wěn)定的。輸出穩(wěn)定的時(shí)候每個(gè)男生所匹配的女生。
思路:
? ? ? 哎!本來(lái)就是一個(gè)最基本的穩(wěn)定婚姻問(wèn)題,輸入輸出的地方被白書(shū)翻譯出翔了,我C,弄的我怎么敲都過(guò)不去,后來(lái)看了下白書(shū)的代碼發(fā)現(xiàn)他是先輸出男生心目中女生的排名,而他前面說(shuō)的卻不是這個(gè),改了之后還是不過(guò),后來(lái)又接著往下看,發(fā)現(xiàn)輸出的是男生的結(jié)果,不是女生,就是一個(gè)輸入輸出整的調(diào)了好久,本來(lái)我的模板就是我自己寫(xiě)的,還以為是自己的模板寫(xiě)錯(cuò)了。
上面說(shuō)了那么多廢話,下面來(lái)說(shuō)下穩(wěn)定婚姻問(wèn)題的思想吧,首先穩(wěn)定婚姻問(wèn)題是必然有唯一解的,至于為什么,這個(gè)可以去網(wǎng)上找詳細(xì)證明,如果不想證明,我們可以想一下每個(gè)人心中都對(duì)所有人排名了,如果剩下一個(gè)女生,那么必定會(huì)剩下一個(gè)男生,所謂剩下的就是他們不能再追求得上自己更喜歡的了,最后就剩他兩個(gè)了,直接匹配上也是穩(wěn)定的。對(duì)于算法的過(guò)程是這樣的,我們先把所有男生都扔進(jìn)隊(duì)列,隊(duì)列里的就表示當(dāng)前沒(méi)有找到對(duì)象的男生,然后男生一個(gè)一個(gè)的從隊(duì)列出來(lái),出來(lái)后從自己最喜歡的女生開(kāi)始一個(gè)一個(gè)訪問(wèn),如果這個(gè)女生當(dāng)前沒(méi)有對(duì)象,那么直接匹配上,如果有的話就看看是不是自己在那個(gè)女生心中的地位比她當(dāng)前的對(duì)象好,如果好,那么直接匹配,那個(gè)女生之前的對(duì)象將被扔回單身隊(duì)列,就這樣一直到單身隊(duì)列為空就完事了,算法整體上看感覺(jué)男生很可憐,很容易被女生直接扔回去,其實(shí)女生更可憐,沒(méi)有自己的主動(dòng)權(quán),只能是等著選他的男生中選一個(gè)最好的,自己最喜歡的男生可能永遠(yuǎn)不會(huì)去選擇他,呵呵,感覺(jué)算法比較搞笑....
#include<stdio.h>
#include<string.h>
#include<queue>
#define N 1000 + 10
using namespace std;
int map[N][N] ,sc[N][N];
int mark[N][N];
int nowb[N] ,nowg[N];
void Marry(int n)
{
? ?queue<int>q;
? ?for(int i = 1 ;i <= n ;i++)?
? ?q.push(i);
? ?memset(nowb ,255 ,sizeof(nowb));
? ?memset(nowg ,255 ,sizeof(nowg));
? ?memset(mark ,0 ,sizeof(mark));
? ?while(!q.empty())
? ?{
? ? ? int xin ,tou;
? ? ? tou = q.front();
? ? ? q.pop();
? ? ? for(int i = 1 ;i <= n ;i ++)
? ? ? {
? ? ? ? ?xin = map[tou][i];
? ? ? ? ?if(mark[tou][xin]) continue;
? ? ? ? ?mark[tou][xin] = 1;
? ? ? ? ?if(nowg[xin] == -1)
? ? ? ? ?{
? ? ? ? ? ? ?nowg[xin] = tou;
? ? ? ? ? ? ?nowb[tou] = xin;
? ? ? ? ? ? ?break;
? ? ? ? ?}
? ? ? ? ?else if(sc[xin][tou] > sc[xin][nowg[xin]])
? ? ? ? ?{
? ? ? ? ? ? ?q.push(nowg[xin]);
? ? ? ? ? ? ?nowg[xin] = tou;
? ? ? ? ? ? ?nowb[tou] = xin;
? ? ? ? ? ? ?break;
? ? ? ? ?}
? ? ? ?}
? ?}
}
?
int main ()
{
? ? int t ,n ,i ,j ,a;
? ? scanf("%d" ,&t);
? ? while(t--)
? ? {
? ? ? ? scanf("%d" ,&n);
? ? ? ? for(i = 1 ;i <= n ;i ++)
? ? ? ? for(j = 1 ;j <= n ;j ++)
? ? ? ? scanf("%d" ,&map[i][j]);?
? ? ? ? for(i = 1 ;i <= n ;i ++)
? ? ? ? {
? ? ? ? ? ?for(j = 1 ;j <= n ;j ++)
? ? ? ? ? ?{
? ? ? ? ? ? ? scanf("%d" ,&a);
? ? ? ? ? ? ? sc[i][a] = n - j + 1;
? ? ? ? ? ?}
? ? ? ? }
? ? ? ? Marry(n);
? ? ? ? for(i = 1 ;i <= n ;i ++)
? ? ? ? printf("%d\n" ,nowb[i]);
? ? ? ? if(t) puts("");
? ? }
? ? return 0;
} ? ? ??
? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
? ? ? ? ??
總結(jié)
以上是生活随笔為你收集整理的LA3989女士的选择的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LA3971组装电脑
- 下一篇: LA3403天平难题(4个DFS)