一般图的稳定婚姻问题(Irving 算法)
问题:给定有 \(n\) 个人,每一个人对其他人都列出了一个列表,表示他所期望室友的排名。
现在你需要给这 \(n\) 个人两两配对,如果对于两个人 \(u\) 和 \(v\),\(u\) 所配到的人没有 \(v\) 优,\(v\) 所配到的人也没有 \(u\) 优,那么这样的配对是不稳定的。
请找出一个稳定的配对方案,或者指出无解。
\(\\\)
算法分为两个部分:
第一部分:我们跑类似稳定婚姻的算法,每个人找他列表中还没拒绝过他的第一个人去发出请求,如果一个人收到了更好的请求(或者还没收到过请求),他就会暂时接受,并且把原来接受的人从列表中去除。同样如果一个人追求失败,我们也把他追求失败的人从列表中去除。但是这一部分我们不要求一个人所追求的人必须和他接受请求的人相同。
最后按追求关系或者接受关系,我们应当得到了若干个环。
接下来我们来化简每个人的列表,对于一个人来说,他所接受的人之后的人全部删除,并且我们在这些被删除的人的列表中,把这个人也删除。
这样我们就得到了一张化简后的表。
第二部分:因为我们要找的其实是匹配,所以我们执行“旋转操作”:
找一个人 \(a\),对于他列表中第一个人 \(b\),如果 \(b\) 的列表的第一个不是 \(a\),那么我们再看第二个人 \(c\),看看 \(c\) 是哪个人列表中的第一个,转到那个人 \(d\),继续考虑他列表的第二个人 \(e\),看 \(e\) 是哪个人列表的第一个,记为 \(f\)。形式化的,找到 \(m\) 个二元组 \((x_1,y_1),(x_2,y_2),\dots,(x_m,y_m)\) 满足 \(y_i\) 是 \(x_i\) 列表中第一个人,\(y_{{i\bmod m}+1}\) 是 \(x_i\) 列表的第二个人。随后我们把 \(y_i\) 从 \(x_i\) 列表中删去,\(x_i\) 从 \(y_i\) 列表中删除。
重复上述过程直到每个人被匹配。
如果过程中某一时刻某个人的列表为空,则说明无解。
总复杂度 \(O(n^2)\)。