C++ 程式用於為給定特定情況解決匹配問題


這是一份用於為給定特定情況解決匹配問題的 C++ 程式。此處給定 N 位男性和 N 位女性,每個人都已按照自己的偏好順序對異性的所有成員進行排名,將男性和女性配對結婚,以確保不存在一對異性,他們都會比他們的現任伴侶更願意彼此在一起。如果不存在這樣的人,那麼所有婚姻都是“穩定的”。

演算法

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

示例

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

輸出

Woman Man
4 3
5 1
6 2
7 0

更新於:2019 年 07 月 30 日

416 次瀏覽

開啟你的 職業生涯

透過完成課程來獲得認證

開始學習
廣告