LA3989女士的选择
生活随笔
收集整理的這篇文章主要介紹了
LA3989女士的选择
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 給你n個男士n個女士,然后給你每個男士中女士的排名,和每個女士中每個男士在他們心中的排名,問你是否可以組成穩定的舞伴,如果存在以下情況(1)男生u和女生v不是舞伴,他們喜歡對方的程度都大于各自當前舞伴的程度,他們就可能拋棄自己現在的舞伴,這樣的話匹配就不是穩定的。輸出穩定的時候每個男生所匹配的女生。
思路:
? ? ? 哎!本來就是一個最基本的穩定婚姻問題,輸入輸出的地方被白書翻譯出翔了,我C,弄的我怎么敲都過不去,后來看了下白書的代碼發現他是先輸出男生心目中女生的排名,而他前面說的卻不是這個,改了之后還是不過,后來又接著往下看,發現輸出的是男生的結果,不是女生,就是一個輸入輸出整的調了好久,本來我的模板就是我自己寫的,還以為是自己的模板寫錯了。
上面說了那么多廢話,下面來說下穩定婚姻問題的思想吧,首先穩定婚姻問題是必然有唯一解的,至于為什么,這個可以去網上找詳細證明,如果不想證明,我們可以想一下每個人心中都對所有人排名了,如果剩下一個女生,那么必定會剩下一個男生,所謂剩下的就是他們不能再追求得上自己更喜歡的了,最后就剩他兩個了,直接匹配上也是穩定的。對于算法的過程是這樣的,我們先把所有男生都扔進隊列,隊列里的就表示當前沒有找到對象的男生,然后男生一個一個的從隊列出來,出來后從自己最喜歡的女生開始一個一個訪問,如果這個女生當前沒有對象,那么直接匹配上,如果有的話就看看是不是自己在那個女生心中的地位比她當前的對象好,如果好,那么直接匹配,那個女生之前的對象將被扔回單身隊列,就這樣一直到單身隊列為空就完事了,算法整體上看感覺男生很可憐,很容易被女生直接扔回去,其實女生更可憐,沒有自己的主動權,只能是等著選他的男生中選一個最好的,自己最喜歡的男生可能永遠不會去選擇他,呵呵,感覺算法比較搞笑....
#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個男士n個女士,然后給你每個男士中女士的排名,和每個女士中每個男士在他們心中的排名,問你是否可以組成穩定的舞伴,如果存在以下情況(1)男生u和女生v不是舞伴,他們喜歡對方的程度都大于各自當前舞伴的程度,他們就可能拋棄自己現在的舞伴,這樣的話匹配就不是穩定的。輸出穩定的時候每個男生所匹配的女生。
思路:
? ? ? 哎!本來就是一個最基本的穩定婚姻問題,輸入輸出的地方被白書翻譯出翔了,我C,弄的我怎么敲都過不去,后來看了下白書的代碼發現他是先輸出男生心目中女生的排名,而他前面說的卻不是這個,改了之后還是不過,后來又接著往下看,發現輸出的是男生的結果,不是女生,就是一個輸入輸出整的調了好久,本來我的模板就是我自己寫的,還以為是自己的模板寫錯了。
上面說了那么多廢話,下面來說下穩定婚姻問題的思想吧,首先穩定婚姻問題是必然有唯一解的,至于為什么,這個可以去網上找詳細證明,如果不想證明,我們可以想一下每個人心中都對所有人排名了,如果剩下一個女生,那么必定會剩下一個男生,所謂剩下的就是他們不能再追求得上自己更喜歡的了,最后就剩他兩個了,直接匹配上也是穩定的。對于算法的過程是這樣的,我們先把所有男生都扔進隊列,隊列里的就表示當前沒有找到對象的男生,然后男生一個一個的從隊列出來,出來后從自己最喜歡的女生開始一個一個訪問,如果這個女生當前沒有對象,那么直接匹配上,如果有的話就看看是不是自己在那個女生心中的地位比她當前的對象好,如果好,那么直接匹配,那個女生之前的對象將被扔回單身隊列,就這樣一直到單身隊列為空就完事了,算法整體上看感覺男生很可憐,很容易被女生直接扔回去,其實女生更可憐,沒有自己的主動權,只能是等著選他的男生中選一個最好的,自己最喜歡的男生可能永遠不會去選擇他,呵呵,感覺算法比較搞笑....
#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;
} ? ? ??
? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
? ? ? ? ??
總結
以上是生活随笔為你收集整理的LA3989女士的选择的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LA3971组装电脑
- 下一篇: LA3403天平难题(4个DFS)