OI 模板合集


更新日志

20220203 添加图论模块、稳定婚姻问题。

模板

图论

稳定婚姻问题

// 稳定婚姻匹配
// GS 算法
// 模板题 poj3487 
// 链接 : https://vjudge.net/problem/POJ-3487

int n, rk[30][30], po[30][30], cur[30], ans[30], mat[30];
map id;
char s[30], name_male[30][30], name_female[30][30];
queue q;

// n : 人数
// rk[i][j] : 男生 i 那里排名 j 的女生
// po[i][j] : 女生 i 那里男生 j 的排名
// id[s] : 名字为 s 的人的编号,区分男女
// cur[i] : 男生 i 当前尝试到他那里排名为 j 的女生
// mat[i] : 女生 i 当前匹配的男生
// ans[i] : 男生 i 最后匹配的女生

void match() {
	while (q.size()) {
		int u = q.front(); q.pop();
		for (int i = cur[u] + 1; i <= n; i++) {
			int v = rk[u][i];
			bool flg = false;
			if (!mat[v]) {
				mat[v] = u;
				flg = true;
			} else if (po[v][mat[v]] > po[v][u]) {
				q.push(mat[v]);
				mat[v] = u;
				flg = true;
			}
			if (flg) { cur[u] = i; break; }
		}
	}
	for (int i = 1; i <= n; i++) ans[mat[i]] = i;
}