具体参见上篇博客。
都是类似的问题,不过我发现这类问题好像输入格式的控制会稍微难一点。
Gale-shapley的实现会相对简单很多。其中求loc部分其实也可以用map优化一下,否则我的实现是可能退化到O(n^3)的。
当然这问题规模实在是太小了,所以也就不需要优化。。。
#include <cstdio>
#include <cstring>
#include <vector>
#include <utility>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
const int MAX = 30;
int ggid[MAX], mmid[MAX];
vector<int> gg[MAX], mm[MAX];
char gglist[MAX], mmlist[MAX];
bool vis[MAX];
bool rej[MAX][MAX];
int match[MAX];
int n;
int loc(int a, int b) {
for (int i = 0; i < n; ++i) {
if (mm[a][i] == b) return i;
}
}
void solve() {
memset(vis, false, sizeof(vis));
memset(match, -1, sizeof(match));
memset(rej, false, sizeof(rej));
bool flag = true;
while (flag) {
flag = false;
for (int i = 1; i <= n; ++i) {
if (!vis[i]) {
for (int j = 0; j < n; +&