程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj3487 The Stable Marriage Problem(最穩定的婚姻)

poj3487 The Stable Marriage Problem(最穩定的婚姻)

編輯:C++入門知識

The Stable Marriage Problem Time Limit: 1000MS   Memory Limit: 65536K  Total Submissions: 1966   Accepted: 838    Description   The stable marriage problem consists of matching members of two different sets according to the member’s preferences for the other set’s members. The input for our problem consists of:   a set M of n males; a set F of n females; for each male and female we have a list of all the members of the opposite gender in order of preference (from the most preferable to the least). A marriage is a one-to-one mapping between males and females. A marriage is called stable, if there is no pair (m, f) such that f ∈ F prefers m ∈ M to her current partner and m prefers f over his current partner. The stable marriage A is called male-optimal if there is no other stable marriage B, where any male matches a female he prefers more than the one assigned in A.   Given preferable lists of males and females, you must find the male-optimal stable marriage.   Input   The first line gives you the number of tests. The first line of each test case contains integer n (0 < n < 27). Next line describes n male and n female names. Male name is a lowercase letter, female name is an upper-case letter. Then go n lines, that describe preferable lists for males. Next n lines describe preferable lists for females.   Output   For each test case find and print the pairs of the stable marriage, which is male-optimal. The pairs in each test case must be printed in lexicographical order of their male names as shown in sample output. Output an empty line between test cases.   Sample Input   2 3 a b c A B C a:BAC b:BAC c:ACB A:acb B:bac C:cab 3 a b c A B C a:ABC b:ABC c:BCA A:bac B:acb C:abcSample Output   a A b B c C   a B b A c C有n個男士n個女士,每個人都對所有異性有一個評價值,男的對女的表白,如果女的沒有對象,就會接納這個男的,如果女的有對象但是女的對這個對象的好感不如表白這個人的好感,這個女的會拋棄現在的對象和對她表白的那個人在一起,要求出最穩定的婚姻狀態。 [cpp]  #include<stdio.h>      #include<string.h>    #include<iostream>    #include<queue>    using namespace std;  int male[30],female[30];   int  m[30][30],fm[30][30];  int vis[30];  int n;   char t[60];  queue<int> q;  void scanf_name()   {      char tmp[30];      gets(t);       //cout<<t <<endl;       for(int i=0; i<n; i++)       {          gets(tmp);           //cout<<tmp <<endl;            int poit=tmp[0]-'a'+1;          q.push(poit);           for(int j=2; j<strlen(tmp); j++)           {              int k=tmp[j]-'A'+1;               m[poit][j-1]=k;          }      }       for(int i=0; i<n; i++)      {          //cout<<"cin"<<endl;            gets(tmp);          int poit=tmp[0]-'A'+1;          for(int j=2; j<strlen(tmp); j++)             {                int k=tmp[j]-'a'+1;               fm[poit][k]=j-1;           }      }  }  void GaleShapley()   {      while(!q.empty())       {          int poit=q.front();               //第poit位男士            q.pop();           //if(male[poit]!=-1)                //continue;            if(vis[poit]>n)               continue;           int i=++vis[poit];                  //第poit位男士最喜歡的第i位女士            //vis[poit]++;           int fem=m[poit][i];               //第poit位男士最喜歡的第i為女士是第fem位            if(female[fem]==-1)               //如果第fem位女士沒有喜歡的人           {               female[fem]=poit;               male[poit]=fem;               continue;          }           else          {               int temp=female[fem];               if(fm[fem][temp]>fm[fem][poit])  //如果第fem位女士對當前喜歡的人的喜歡不如對第poit位男士的喜歡               {                   female[fem]=poit;                   male[poit]=fem;                   male[temp]=-1;                   q.push(temp);                    continue;               }              else               {                  q.push(poit);                   continue;               }          }       }  }  int main()  {       int s;      scanf("%d",&s);       while(s--)      {           memset(vis,0,sizeof(vis));           memset(male,-1,sizeof(male));           memset(female,-1,sizeof(female));           while(!q.empty()) q.pop();           scanf("%d",&n);          getchar();           scanf_name();             GaleShapley();          int i=1;           while(i<=n)          {               if(male[i]!=-1)               printf("%c %c\n",i+'a'-1,male[i]+'A'-1);               i++;          }          if(s)           printf("\n");      }       return 0;  }  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved