Advertisement
juanjo12x

Stable_Marriage_Problem

May 4th, 2014
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.84 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int verbose = 0;
  4. enum {
  5.     clown = -1,
  6.     abe, bob, col, dan, ed, fred, gav, hal, ian, jon,
  7.     abi, bea, cath, dee, eve, fay, gay, hope, ivy, jan,
  8. };
  9. const char *name[] = {
  10.     "Abe", "Bob", "Col",  "Dan", "Ed",  "Fred", "Gav", "Hal",  "Ian", "Jon",
  11.     "Abi", "Bea", "Cath", "Dee", "Eve", "Fay",  "Gay", "Hope", "Ivy", "Jan"
  12. };
  13. int pref[jan + 1][jon + 1] = {
  14.     { abi, eve, cath, ivy, jan, dee, fay, bea, hope, gay },
  15.     { cath, hope, abi, dee, eve, fay, bea, jan, ivy, gay },
  16.     { hope, eve, abi, dee, bea, fay, ivy, gay, cath, jan },
  17.     { ivy, fay, dee, gay, hope, eve, jan, bea, cath, abi },
  18.     { jan, dee, bea, cath, fay, eve, abi, ivy, hope, gay },
  19.     { bea, abi, dee, gay, eve, ivy, cath, jan, hope, fay },
  20.     { gay, eve, ivy, bea, cath, abi, dee, hope, jan, fay },
  21.     { abi, eve, hope, fay, ivy, cath, jan, bea, gay, dee },
  22.     { hope, cath, dee, gay, bea, abi, fay, ivy, jan, eve },
  23.     { abi, fay, jan, gay, eve, bea, dee, cath, ivy, hope },
  24.  
  25.     { bob, fred, jon, gav, ian, abe, dan, ed, col, hal   },
  26.     { bob, abe, col, fred, gav, dan, ian, ed, jon, hal   },
  27.     { fred, bob, ed, gav, hal, col, ian, abe, dan, jon   },
  28.     { fred, jon, col, abe, ian, hal, gav, dan, bob, ed   },
  29.     { jon, hal, fred, dan, abe, gav, col, ed, ian, bob   },
  30.     { bob, abe, ed, ian, jon, dan, fred, gav, col, hal   },
  31.     { jon, gav, hal, fred, bob, abe, col, ed, dan, ian   },
  32.     { gav, jon, bob, abe, ian, dan, hal, ed, col, fred   },
  33.     { ian, col, hal, gav, fred, bob, abe, ed, jon, dan   },
  34.     { ed, hal, gav, abe, bob, jon, col, ian, fred, dan   },
  35. };
  36. int pairs[jan + 1], proposed[jan + 1];
  37.  
  38. void engage(int man, int woman)
  39. {
  40.     pairs[man] = woman;
  41.     pairs[woman] = man;
  42.     if (verbose) printf("%4s is engaged to %4s\n", name[man], name[woman]);
  43. }
  44.  
  45. void dump(int woman, int man)
  46. {
  47.     pairs[man] = pairs[woman] = clown;
  48.     if (verbose) printf("%4s dumps %4s\n", name[woman], name[man]);
  49. }
  50.  
  51. /* how high this person ranks that: lower is more preferred */
  52. int rank(int this, int that)
  53. {
  54.     int i;
  55.     for (i = abe; i <= jon && pref[this][i] != that; i++);
  56.     return i;
  57. }
  58.  
  59. void propose(int man, int woman)
  60. {
  61.     int fiance = pairs[woman];
  62.     if (verbose) printf("%4s proposes to %4s\n", name[man], name[woman]);
  63.  
  64.     if (fiance == clown) {
  65.         engage(man, woman);
  66.     } else if (rank(woman, man) < rank(woman, fiance)) {
  67.         dump(woman, fiance);
  68.         engage(man, woman);
  69.     }
  70. }
  71.  
  72. int covet(int man1, int wife2)
  73. {
  74.     if (rank(man1, wife2) < rank(man1, pairs[man1]) &&
  75.             rank(wife2, man1) < rank(wife2, pairs[wife2])) {
  76.         printf( "    %4s (w/ %4s) and %4s (w/ %4s) prefer each other"
  77.             " over current pairing.\n",
  78.             name[man1], name[pairs[man1]], name[wife2], name[pairs[wife2]]
  79.         );
  80.         return 1;
  81.     }
  82.     return 0;
  83. }
  84.  
  85. int thy_neighbors_wife(int man1, int man2)
  86. {   /* +: force checking all pairs; "||" would shortcircuit */
  87.     return covet(man1, pairs[man2]) + covet(man2, pairs[man1]);
  88. }
  89.  
  90. int unstable()
  91. {
  92.     int i, j, bad = 0;
  93.     for (i = abe; i < jon; i++) {
  94.         for (j = i + 1; j <= jon; j++)
  95.             if (thy_neighbors_wife(i, j)) bad = 1;
  96.     }
  97.     return bad;
  98. }
  99.  
  100. int main()
  101. {
  102.     int i, unengaged;
  103.     /* init: everyone marries the clown */
  104.     for (i = abe; i <= jan; i++)
  105.         pairs[i] = proposed[i] = clown;
  106.  
  107.     /* rounds */
  108.     do {
  109.         unengaged = 0;
  110.         for (i = abe; i <= jon; i++) {
  111.         //for (i = abi; i <= jan; i++) { /* could let women propose */
  112.             if (pairs[i] != clown) continue;
  113.             unengaged = 1;
  114.             propose(i, pref[i][++proposed[i]]);
  115.         }
  116.     } while (unengaged);
  117.  
  118.     printf("Pairing:\n");
  119.     for (i = abe; i <= jon; i++)
  120.         printf("  %4s - %s\n", name[i],
  121.             pairs[i] == clown ? "clown" : name[pairs[i]]);
  122.  
  123.     printf(unstable()
  124.         ? "Marriages not stable\n" /* draw sad face here */
  125.         : "Stable matchup\n");
  126.  
  127.     printf("\nBut if Bob and Fred were to swap:\n");
  128.     i = pairs[bob];
  129.     engage(bob, pairs[fred]);
  130.     engage(fred, i);
  131.     printf(unstable() ? "Marriages not stable\n" : "Stable matchup\n");
  132.  
  133.     return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement