-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstablemp.cpp
More file actions
46 lines (44 loc) · 1.06 KB
/
Copy pathstablemp.cpp
File metadata and controls
46 lines (44 loc) · 1.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
vector<queue<int>> M; vector<vector<int>> F; int n;
vector<pii> SMP() {
vector<int> hus(n+1, -1); queue<int> q;
for(int i = 1; i <= n; i++) q.push(i);
while(!q.empty()) {
int husb = q.front(); q.pop();
int wife = M[husb].front(); M[husb].pop();
if(hus[wife] == -1) {
hus[wife] = husb;
} else if(F[wife][hus[wife]] > F[wife][husb]) {
swap(hus[wife], husb); q.push(husb);
} else q.push(husb);
}
vector<pii> res;
for(int i = 1; i <= n; i++) {
res.pb(mp(hus[i], i));
} return res;
}
int main() {
// n is number of marriages
cin >> n; M.resize(n+1); F.resize(n+1);
for(int i = 0; i < n; i++) {
// First line is the woman in question
int r; cin >> r;
vector<int> cur(n+1);
// Next n elements is husbands listed in rank
// Earlier is better
for(int j = 0; j < n; j++) {
int x; cin >> x;
cur[x] = j;
} F[r] = cur;
}
// Same for men as women
for(int i = 0; i < n; i++) {
int r; cin >> r;
queue<int> cur;
for(int j = 0; j < n; j++) {
int x; cin >> x;
cur.push(x);
} M[r] = cur;
}
auto ans = SMP();
cout << ans << endl;
}