Skip to content

Commit 321ff76

Browse files
committed
Added gale_shapley.cpp in greedy_algorithms
1 parent f789e3b commit 321ff76

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

greedy_algorithms/gale_shapley.cpp

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <cstring>
4+
#include <algorithm>
5+
using namespace std;
6+
7+
void stableMatch(const vector<vector<int>>& women_prefs, const vector<vector<int>>& men_prefs, int n) {
8+
vector<int> engagements(n, -1);
9+
vector<bool> free_men(n, true);
10+
vector<int> next_proposal(n, 0); // Tracks the next woman to propose for each man
11+
12+
while (true) {
13+
int freeMan;
14+
for (freeMan = 0; freeMan < n; freeMan++) {
15+
if (free_men[freeMan]) break;
16+
}
17+
if (freeMan == n) break;
18+
19+
int womanToPropose = men_prefs[freeMan][next_proposal[freeMan]];
20+
next_proposal[freeMan]++;
21+
int currentFiance = engagements[womanToPropose];
22+
23+
if (currentFiance == -1) {
24+
engagements[womanToPropose] = freeMan;
25+
free_men[freeMan] = false;
26+
} else {
27+
if (find(women_prefs[womanToPropose].begin(), women_prefs[womanToPropose].end(), freeMan) <
28+
find(women_prefs[womanToPropose].begin(), women_prefs[womanToPropose].end(), currentFiance)) {
29+
engagements[womanToPropose] = freeMan;
30+
free_men[freeMan] = false;
31+
free_men[currentFiance] = true;
32+
}
33+
}
34+
}
35+
36+
cout << "Stable Matches:\n";
37+
for (int woman = 0; woman < n; woman++) {
38+
cout << "Woman " << woman << " is engaged to Man " << engagements[woman] << endl;
39+
}
40+
}
41+
42+
void runTestCase(int caseNum) {
43+
const int n = 4; // Number of men and women
44+
45+
// Test Case 1
46+
if (caseNum == 1) {
47+
cout << "Test Case 1:\n";
48+
vector<vector<int>> women_prefs = {
49+
{1, 0, 3, 2}, // Alice
50+
{0, 1, 2, 3}, // Becky
51+
{1, 2, 0, 3}, // Cathy
52+
{3, 2, 1, 0} // Diana
53+
};
54+
vector<vector<int>> men_prefs = {
55+
{0, 1, 2, 3}, // Bob
56+
{1, 0, 3, 2}, // Charlie
57+
{0, 2, 3, 1}, // David
58+
{2, 1, 0, 3} // Edward
59+
};
60+
stableMatch(women_prefs, men_prefs, n);
61+
}
62+
63+
// Test Case 2
64+
else if (caseNum == 2) {
65+
cout << "Test Case 2:\n";
66+
vector<vector<int>> women_prefs = {
67+
{0, 1, 2, 3}, // Eve
68+
{1, 0, 3, 2}, // Grace
69+
{2, 1, 0, 3}, // Hannah
70+
{3, 2, 1, 0} // Ivy
71+
};
72+
vector<vector<int>> men_prefs = {
73+
{1, 0, 3, 2}, // Frank
74+
{0, 1, 2, 3}, // George
75+
{1, 2, 0, 3}, // Henry
76+
{2, 0, 1, 3} // Ian
77+
};
78+
stableMatch(women_prefs, men_prefs, n);
79+
}
80+
81+
// Test Case 3
82+
else if (caseNum == 3) {
83+
cout << "Test Case 3:\n";
84+
vector<vector<int>> women_prefs = {
85+
{2, 1, 0, 3}, // Jade
86+
{0, 2, 3, 1}, // Lucy
87+
{3, 2, 1, 0}, // Mia
88+
{1, 3, 0, 2} // Nina
89+
};
90+
vector<vector<int>> men_prefs = {
91+
{1, 0, 2, 3}, // Kyle
92+
{0, 2, 3, 1}, // Liam
93+
{2, 1, 3, 0}, // Mason
94+
{3, 2, 1, 0} // Nathan
95+
};
96+
stableMatch(women_prefs, men_prefs, n);
97+
}
98+
}
99+
100+
int main() {
101+
for (int i = 1; i <= 3; i++) {
102+
runTestCase(i);
103+
cout << endl;
104+
}
105+
return 0;
106+
}

0 commit comments

Comments
 (0)