C++ Program to Solve a Matching Problem for a Given Specific Case

This is a C++ Program to solve a matching problem for a Given Specific Case. Here, N men and N women are given, each person has ranked all members of the opposite gender in order of preference, marry the men and women together such that there are no two people of opposite gender who would both rather have each other than their current partners. All the marriages are “stable”, if there are no such people exists.

Algorithms

Begin
   function WomenPrefersMenOverMen1():
   A) Check if women prefer men over her current engagement men1
   B) If men1 comes before men in list of women, then women prefer her current engagement.
   C) If men comes before men1 in womens's list, then free her current engagement and engage her with men.
End
Begin
   function stablewedding():
   1) Boys are numbered as 0 to N-1.
   2) Girls are numbered as N to 2N-1.
   3) While men are free
      A) Pick the first free man
      B) One by one go to all women according to pick free man’s preferences.
      C) The woman of preference is free, woman and man become partners.
      D) If woman is not free Find current engagement of woman
      E) If woman prefers man over her current engagement man1, then break the engagement between woman and man1 and engage man with woman.
End

Example

<span class="com">#include</span><span class="pln"> </span><span class="str"><iostream></span>
<span class="com">#include</span><span class="pln"> </span><span class="str"><string.h></span>
<span class="com">#include</span><span class="pln"> </span><span class="str"><stdio.h></span>
<span class="kwd">using</span><span class="pln"> </span><span class="kwd">namespace</span><span class="pln"> std</span><span class="pun">;</span>
<span class="com">#define</span><span class="pln"> N </span><span class="lit">4</span>
<span class="kwd">bool</span><span class="pln"> </span><span class="typ">WomenPrefersMenOverMen1</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> prefer</span><span class="pun">[</span><span class="lit">2</span><span class="pun">*</span><span class="pln">N</span><span class="pun">][</span><span class="pln">N</span><span class="pun">],</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> w</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> m</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> m1</span><span class="pun">) </span><span class="pun">{</span>
<span class="kwd">   for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> N</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++) </span><span class="pun">{</span>
<span class="kwd">      if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">prefer</span><span class="pun">[</span><span class="pln">w</span><span class="pun">][</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> m1</span><span class="pun">)</span>
<span class="kwd">         return</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span>
<span class="kwd">      if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">prefer</span><span class="pun">[</span><span class="pln">w</span><span class="pun">][</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> m</span><span class="pun">)</span>
<span class="kwd">         return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span>
<span class="pun">   }</span>
<span class="pun">}</span>
<span class="kwd">void</span><span class="pln"> stablewedding</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> prefer</span><span class="pun">[</span><span class="lit">2</span><span class="pun">*</span><span class="pln">N</span><span class="pun">][</span><span class="pln">N</span><span class="pun">]) </span><span class="pun">{</span>
<span class="kwd">   int</span><span class="pln"> wPartner</span><span class="pun">[</span><span class="pln">N</span><span class="pun">];</span><span class="pln"> </span><span class="com">//Initialize an array to store partner of women.</span>
   <span class="kwd">bool</span><span class="pln"> mFree</span><span class="pun">[</span><span class="pln">N</span><span class="pun">];</span><span class="pln"> </span><span class="com">//Initialize an array to store availability of men.</span>
<span class="com">   //Initialize all men and women as free.</span>
<span class="pln">   memset</span><span class="pun">(</span><span class="pln">wPartner</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">wPartner</span><span class="pun">));</span>
<span class="pln">   memset</span><span class="pun">(</span><span class="pln">mFree</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">mFree</span><span class="pun">));</span>
<span class="kwd">   int</span><span class="pln"> freeCnt </span><span class="pun">=</span><span class="pln"> N</span><span class="pun">;</span>
<span class="kwd">   while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">freeCnt </span><span class="pun">></span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> { </span><span class="com">//While men is free</span>
<span class="kwd">      int</span><span class="pln"> m</span><span class="pun">;</span><span class="pln"> </span><span class="com">//Pick the first free man</span>
<span class="com">      //One by one go to all women according to pick free man’s preferences.</span>
<span class="kwd">      for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">m </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> m </span><span class="pun"><</span><span class="pln"> N</span><span class="pun">;</span><span class="pln"> m</span><span class="pun">++)</span>
<span class="kwd">         if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mFree</span><span class="pun">[</span><span class="pln">m</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span>
<span class="kwd">            break</span><span class="pun">;</span>
<span class="kwd">      for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> N </span><span class="pun">&&</span><span class="pln"> mFree</span><span class="pun">[</span><span class="pln">m</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++) </span><span class="pun">{</span>
<span class="kwd">         int</span><span class="pln"> w </span><span class="pun">=</span><span class="pln"> prefer</span><span class="pun">[</span><span class="pln">m</span><span class="pun">][</span><span class="pln">i</span><span class="pun">];</span>
<span class="com">         //The woman of preference is free, woman and man become partners.</span>
<span class="kwd">         if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">wPartner</span><span class="pun">[</span><span class="pln">w</span><span class="pun">-</span><span class="pln">N</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">) </span><span class="pun">{</span>
<span class="pln">            wPartner</span><span class="pun">[</span><span class="pln">w</span><span class="pun">-</span><span class="pln">N</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> m</span><span class="pun">;</span>
<span class="pln">            mFree</span><span class="pun">[</span><span class="pln">m</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span>
<span class="pln">            freeCnt</span><span class="pun">--;</span>
<span class="pun">         } </span><span class="kwd">else {</span><span class="pln"> </span><span class="com">//If w is not free</span>
<span class="pun">            </span><span class="pln"> </span><span class="com">//Find current engagement of woman</span>
<span class="kwd">            int</span><span class="pln"> m1 </span><span class="pun">=</span><span class="pln"> wPartner</span><span class="pun">[</span><span class="pln">w</span><span class="pun">-</span><span class="pln">N</span><span class="pun">];</span>
<span class="com">            // If woman prefers man over her current engagement man1, </span>
<span class="com">            // then break the engagement between woman and man1 and engage man with woman.</span>
<span class="kwd">            if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">WomenPrefersMenOverMen1</span><span class="pun">(</span><span class="pln">prefer</span><span class="pun">,</span><span class="pln"> w</span><span class="pun">,</span><span class="pln"> m</span><span class="pun">,</span><span class="pln"> m1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">) </span><span class="pun">{</span>
<span class="pln">               wPartner</span><span class="pun">[</span><span class="pln">w</span><span class="pun">-</span><span class="pln">N</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> m</span><span class="pun">;</span>
<span class="pln">               mFree</span><span class="pun">[</span><span class="pln">m</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span>
<span class="pln">               mFree</span><span class="pun">[</span><span class="pln">m1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span>
<span class="pun">            }</span>
<span class="pun">         }      </span>
<span class="pun">      }</span>
<span class="pun">   }</span>
<span class="pln">   cout </span><span class="pun"><<</span><span class="pln"> </span><span class="str">"Woman Man"</span><span class="pln"> </span><span class="pun"><<</span><span class="pln"> endl</span><span class="pun">;</span>
<span class="kwd">   for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> N</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span>
<span class="pln">      cout </span><span class="pun"><<</span><span class="pln"> </span><span class="str">" "</span><span class="pln"> </span><span class="pun"><<</span><span class="pln"> i</span><span class="pun">+</span><span class="pln">N </span><span class="pun"><<</span><span class="pln"> </span><span class="str">"\t"</span><span class="pln"> </span><span class="pun"><<</span><span class="pln"> wPartner</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun"><<</span><span class="pln"> endl</span><span class="pun">;</span>
<span class="pun">}</span>
<span class="kwd">int</span><span class="pln"> main</span><span class="pun">() </span><span class="pun">{</span>
<span class="kwd">   int</span><span class="pln"> p</span><span class="pun">[</span><span class="lit">2</span><span class="pun">*</span><span class="pln">N</span><span class="pun">][</span><span class="pln">N</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span>
<span class="pln">      </span><span class="pun">{</span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">},</span>
<span class="pun">      {</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">},</span>
<span class="pun">      {</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">},</span>
<span class="pun">      {</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">},</span>
<span class="pun">      {</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">},</span>
<span class="pun">      {</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">},</span>
<span class="pun">      {</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">},</span>
<span class="pun">      {</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">},</span>
<span class="pun">   };</span>
<span class="pln">   stablewedding</span><span class="pun">(</span><span class="pln">p</span><span class="pun">);</span>
<span class="kwd">   return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span>
<span class="pun">}</span>

Output

Woman Man
4 3
5 1
6 2
7 0
Updated on: 2019-07-30T22:30:26+05:30

533 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements