BotByte

Stable Marriage Problem.cpp

Mar 14th, 2017
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 KB | None | 0 0
  1. /* Stable Marriage Problem */
  2. /* Author : M. A. Rafsan Mazumder */
  3.  
  4. #include <bits/stdc++.h>
  5.  
  6. using namespace std;
  7.  
  8. #define MAX 205
  9. int N;
  10. int prefer[MAX][MAX];
  11. int wPartner[MAX];
  12. int iterate[MAX];
  13.  
  14. //Input is a 2D matrix of size (2*N)*N where N is the number of women
  15. //or men. Rows from 0 to N-1 represent preference lists of men and
  16. //rows from N to 2*N – 1 represent preference lists of women. So men
  17. //are numbered from 0 to N-1 and women are numbered from N to 2*N – 1.
  18.  
  19. bool wPreferM1overM(int w, int m1, int m)
  20. {
  21.     for(int i=0; i<N; i++){
  22.         if(prefer[w][i] == m1) return true;
  23.         if(prefer[w][i] == m) return false;
  24.     }
  25. }
  26.  
  27. void stableMarriage()
  28. {
  29.     bool mFree[N]; //if mFree[i] is true, then i is not married yet
  30.     memset(mFree, true, sizeof mFree);
  31.     memset(wPartner, -1, sizeof wPartner);
  32.     memset(iterate, 0, sizeof iterate);
  33.  
  34.     int freeCount = N;
  35.     while(freeCount > 0){
  36.         int m;
  37.         for(int i=0; i<N; i++){
  38.             if(mFree[i]) m = i;
  39.         }
  40.         for(int i=iterate[m]; i<N && mFree[m] == true; i++){
  41.             int w = prefer[m][i];
  42.  
  43.             if(wPartner[w] == -1){
  44.                 wPartner[w] = m;
  45.                 mFree[m] = false;
  46.                 freeCount--;
  47.             }
  48.             else {
  49.                 int m1 = wPartner[w];
  50.                 if(wPreferM1overM(w, m1, m) == false){
  51.                     wPartner[w] = m;
  52.                     mFree[m] = false;
  53.                     mFree[m1] = true;
  54.                 }
  55.             }
  56.             iterate[m]++;
  57.         }
  58.     }
  59. }
  60.  
  61. int main()
  62. {
  63.     freopen("in.txt", "r", stdin);
  64.     scanf("%d", &N);
  65.     for(int i=0; i<2*N; i++){
  66.         for(int j=0; j<N; j++) scanf("%d", &prefer[i][j]);
  67.     }
  68.     stableMarriage();
  69.     for(int i=N; i<2*N; i++) printf("%d %d\n", i, wPartner[i]);
  70.  
  71. }
Advertisement
Add Comment
Please, Sign In to add comment