dilworth
有一个表示“序关系”的有向图 \((V,E)\),对 \(E\) 求个传递闭包就构成了一个偏序 \(E'\)。
最长反链定义为:\(S\subset V\) 满足 \(S\) 任意两点在 \(E'\) 上不相邻时,\(|S|\) 的最大值。
众所周知的是 dilworth 定理:最长反链=最小"链覆盖"。不过这个最小链覆盖如何定义呢?
有两种定义方式,我将其分别称之为“最小无交路径覆盖”与“最小可交路径覆盖”。
\(E\) 上路径为一个序列 \(v_1\rightarrow v_2\rightarrow \dots \rightarrow v_k\),当若干条路径 \(\{v_i\}\) 的并集为全集 \(V\) 时,称它们构成了一个路径覆盖(或者可交路径覆盖)。特别的,如果为无交并,则称构成一组 无交路径覆盖。
那这俩东西怎么求呢?
先说最小无交路径覆盖:DAG 的性质非常好,路径一定不会连成环。那只要将 \(x\) 练到 \(y\) 合法,路径数就少了 \(1\)。所以我希望给尽可能多的点安排入点(或者出点)。这相当于把每个点 \(x\) 拆成 \(x_{in}\)(左部点)和 \(x_{out}\)(右部点)。如果原图中有 \(x\rightarrow y\) 的边,则相当于可以把 \(x_{in}\) 和 \(y_{out}\) 连边(流量为 \(1\)),跑最大匹配即可。设最大匹配为 \(|M|\),则最小无交路径覆盖为 \(|V|-|M|\)。
再说最小可交路径覆盖:先给结论,\(E\) 的 可交路径覆盖 与 \(E'\) 的 无交路径覆盖 可以互相转化。手玩一下发现很好理解。所以要么跑完传递闭包用网络流算上面东西,要么考虑优化建图:\(x_{out}\) 向 \(x_{in}\) 连流量为无穷的边,表示可以随意跳来跳去。本质就是考虑哪些左部点应该到达哪些右部点。
接下来是构造方案:通过流构造路径覆盖很容易,所以只说说反链。
我们知道二分图最大独立集的做法:残量网络上从源点开始 bfs,能走到的左部点和走不到的右部点一起构成了最大独立集。
然后我们声称,\(S\) 包含 \(x\) 当且仅当 \(x_{in}\) 和 \(x_{out}\) 同时在独立集中,则 \(S\) 构成了一条最长反链。
什么?你问我为什么?

浙公网安备 33010602011771号