Advertisement
dipBRUR

Stable Marrige Problem

Oct 4th, 2018
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.15 KB | None | 0 0
  1. int prefer[maxn][maxn], wpartner[maxn], mfree[maxn];  
  2. int N;  
  3.  
  4. bool wPreferM1OverM(int w, int m1, int m)  
  5. {  
  6.     for (int i = 1; i <= N; i++)  
  7.     {  
  8.         if (prefer[w][i] == m1)    return true;  
  9.         if (prefer[w][i] == m)     return false;  
  10.     }  
  11. }  
  12.  
  13. void stableMarriage()  
  14. {  
  15.     memo(wpartner, -1);  
  16.     memo(mfree, 0);  
  17.     int freeCount = N;  
  18.     while (freeCount)  
  19.     {  
  20.         int m;  
  21.         for (m = 1; m <= N; m++)  
  22.         {  
  23.             if (mfree[m] == 0)  
  24.                 break;  
  25.         }  
  26.         for (int i = 1; i <= N && mfree[m] == 0; i++)  
  27.         {  
  28.             int w = prefer[m][i];  
  29.             if (wpartner[w] == -1)  
  30.             {  
  31.                 wpartner[w] = m;  
  32.                 mfree[m] = 1;  
  33.                 freeCount--;  
  34.             }  
  35.             else  
  36.             {  
  37.                 int m1 = wpartner[w];  
  38.                 if (wPreferM1OverM(w, m1, m) == false)  
  39.                 {  
  40.                     wpartner[w] = m;  
  41.                     mfree[m] = 1;  
  42.                     mfree[m1] = 0;  
  43.                 }  
  44.             }  
  45.         }  
  46.     }  
  47.     int woman[maxn];  
  48.     for (int i = N; i <= 2*N; i++)  
  49.         woman[ wpartner[i] ] = i-N;  
  50.     for (int i = 1; i <= N; i++)  
  51.         printf("%d %d\n", i, woman[i]);  
  52. }  
  53. int main()  
  54. {  
  55.     int tc;  
  56.     scanf("%d", &tc);  
  57.     for (int tcase = 1; tcase <= tc; tcase++)  
  58.     {  
  59.         scanf("%d", &N);  
  60.         for (int i = 1; i <= N; i++) // woman preferences  
  61.         {  
  62.             int w;  
  63.             scanf("%d", &w);  
  64.             w += N;  
  65.             for (int j = 1; j <= N; j++)  
  66.                 scanf("%d", &prefer[w][j]);  
  67.         }  
  68.         for (int i = 1; i <= N; i++) // man preferences  
  69.         {  
  70.             int m;  
  71.             scanf("%d", &m);      
  72.             for (int j = 1; j <= N; j++)  
  73.             {  
  74.                 int w;  
  75.                 scanf("%d", w);  
  76.                 prefer[m][j] = w+N;  
  77.             }  
  78.         }  
  79.         stableMarriage();  
  80.     }  
  81. }  int prefer[maxn][maxn], wpartner[maxn], mfree[maxn];  
  82. int N;  
  83.  
  84. bool wPreferM1OverM(int w, int m1, int m)  
  85. {  
  86.     for (int i = 1; i <= N; i++)  
  87.     {  
  88.         if (prefer[w][i] == m1)    return true;  
  89.         if (prefer[w][i] == m)     return false;  
  90.     }  
  91. }  
  92.  
  93. void stableMarriage()  
  94. {  
  95.     memo(wpartner, -1);  
  96.     memo(mfree, 0);  
  97.     int freeCount = N;  
  98.     while (freeCount)  
  99.     {  
  100.         int m;  
  101.         for (m = 1; m <= N; m++)  
  102.         {  
  103.             if (mfree[m] == 0)  
  104.                 break;  
  105.         }  
  106.         for (int i = 1; i <= N && mfree[m] == 0; i++)  
  107.         {  
  108.             int w = prefer[m][i];  
  109.             if (wpartner[w] == -1)  
  110.             {  
  111.                 wpartner[w] = m;  
  112.                 mfree[m] = 1;  
  113.                 freeCount--;  
  114.             }  
  115.             else  
  116.             {  
  117.                 int m1 = wpartner[w];  
  118.                 if (wPreferM1OverM(w, m1, m) == false)  
  119.                 {  
  120.                     wpartner[w] = m;  
  121.                     mfree[m] = 1;  
  122.                     mfree[m1] = 0;  
  123.                 }  
  124.             }  
  125.         }  
  126.     }  
  127.     int woman[maxn];  
  128.     for (int i = N; i <= 2*N; i++)  
  129.         woman[ wpartner[i] ] = i-N;  
  130.     for (int i = 1; i <= N; i++)  
  131.         printf("%d %d\n", i, woman[i]);  
  132. }  
  133. int main()  
  134. {  
  135.     int tc;  
  136.     scanf("%d", &tc);  
  137.     for (int tcase = 1; tcase <= tc; tcase++)  
  138.     {  
  139.         scanf("%d", &N);  
  140.         for (int i = 1; i <= N; i++) // woman preferences  
  141.         {  
  142.             int w;  
  143.             scanf("%d", &w);  
  144.             w += N;  
  145.             for (int j = 1; j <= N; j++)  
  146.                 scanf("%d", &prefer[w][j]);  
  147.         }  
  148.         for (int i = 1; i <= N; i++) // man preferences  
  149.         {  
  150.             int m;  
  151.             scanf("%d", &m);      
  152.             for (int j = 1; j <= N; j++)  
  153.             {  
  154.                 int w;  
  155.                 scanf("%d", w);  
  156.                 prefer[m][j] = w+N;  
  157.             }  
  158.         }  
  159.         stableMarriage();  
  160.     }  
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement