问题:http://www.spoj.com/problems/DIVREL
在这个问题上,我们只需要找到一组元素的最大数目(不是B形的可分)。如果我们只是从一个元素到它的多个元素做一个边并构造一个图,那么它就是一个dag。
现在问题变成了寻找包含所有顶点的最小链数,这些顶点等于反链基数,Dilworth's theorem因为它是一个半序集。
最小链可以通过二部匹配(如何:它是最小路径覆盖)找到,但现在我无法找到反链元素本身?

最佳答案

要计算反链,可以:
在一个新的二部图D上计算最大二部匹配(例如,用maximum flow algorithm),它具有从LHS A到RHS B的边,当且仅当A除以B时。
使用匹配计算最小顶点覆盖(例如,使用proof of Konig's theorem中描述的算法)
反链由不在顶点覆盖中的所有顶点给出
两个这样的元素之间不能有边,否则我们会发现一个没有被顶点覆盖覆盖的边,从而导致矛盾。
找到最小顶点覆盖的算法是(从上面的链接):
设s0由m不匹配的所有顶点组成。
对于整数j≥0,设s(2j+1)为所有顶点v的集合,使得v通过e中的某个边与s(2j)中的某个顶点相邻,且v未包含在任何
先前定义的集sk,其中k但仍有顶点未包含在任何先前定义的集合中
sk,任意选择其中一个,让s(2j+1)组成
单顶点。
对于整数j≥1,设s(2j)为所有顶点u的集合
这样u通过m中的某个边与s(2j-1)中的某个顶点相邻。注意
对于s(2j-1)中的每个v,都有一个顶点u与其匹配
否则v会在s0中。因此m建立了
s(2j-1)的顶点与
s(2j)的顶点。
奇数索引子集的并集是顶点覆盖。

07-27 23:24