偏序与偏序集 - Dilworth定理
偏序与偏序集 - Dilworth定理
相关基本概念可以在 oiwiki 中找到。
1. Hasse 图
对于偏序集 \((S,\leq)\),构造一张有向图 \(G=(V,E)\):
- 令 \(V\leftarrow S\);
- 若对于 \(x,y\in S\),\(x< y\) 且 \(\nexists z\in S,x< z< y\),则 \(x\) 向 \(y\) 连一条有向边。
称 \(G\) 是 \((S,\leq)\) 的 Hasse 图。\(G\) 一定是有向无环图。
我们求出 \(G\) 的传递闭包,设 \(f_{i,j}\) 表示 \(i\) 能否到达 \(j\)。\(f_{i,j}=1\) 当且仅当 \(i\leq j\)。
利用 Hasse 图,可以将抽象的偏序关系转化为具象的可达关系。
2. Dilworth 定理
Theorem 1
对于偏序集 \((S,\leq)\),其最长链大小等于最小反链覆盖大小。
设 \(S\) 的最长链大小为 \(P\),最小反链覆盖大小为 \(Q\)。
首先有 \(P \leq Q\),因为每个反链中最多包含最长链的一个元素。
那么如果能构造出大小为最长链大小的反链覆盖,命题就成立。
设 \(S_1=S\)。考虑以下构造:
- 初始令 \(i\leftarrow 1\)。
- 设 \(S_i\) 中最小元的集合为 \(T_i\)。若 \(S_i=T_i\) 则终止;否则令 \(S_{i+1}=S_i\setminus T_i\),然后令 \(i\leftarrow i+1\)。
设共得到 \(m\) 个 \(S_i\)。容易发现以下性质:
- 每个 $T_i $ 都是 \(S\) 的一个反链,于是所有 \(T_i\) 构成 \(S\) 的一个反链覆盖;
- 存在一条链 \(C\),使得 \(C_i\in T_i\),且 \(C\) 就是 \(S\) 的一条最长链。
那么得到 \(|C|=m\),于是有 \(P=Q\),命题成立。
Theorem 2
对于偏序集 \((S,\leq)\),其最长反链大小等于最小链覆盖大小。
这里提供两种证明方法。
证明 1:
对 \(|S|\) 施数学归纳法。当 \(|S|\leq 3\) 时显然成立。
设 \(|S|>3\),且命题对于所有 \(|S'|<|S|\) 的 \(S'\) 都成立。
若 \(S\) 中所有元素两两不可比,命题显然成立。
否则,我们拿出 \(S\) 中的一条最长链,再拿出它的最小元 \(x\) 与最大元 \(y\)。
设 \(T=S\setminus\{x,y\}\),\(S\) 的最长反链大小为 \(p\),\(T\) 的最长反链大小为 \(q\)。
若 \(q<p\),那么一定有 \(q=p-1\)。由归纳假设,\(T\) 最小链覆盖大小 \(t\) 与 \(q\) 相等。那么 \(T\) 的最小链覆盖加上 \(\{x,y\}\) 就得到了 \(S\) 的最小链覆盖,命题成立。
否则有 $q=p $。设 \(T\) 的一个最长反链为 \(A\),\(A^+=\{x|x\in S\land (\exists y\in A,y\leq x)\}\),\(A^-=\{x|x\in S\land (\exists y\in A,x\leq y)\}\)。
容易得到一些性质:
- \(A^+\cup A^-=S\);
- \(A^+\cap A^-=A\);
- \(|A^+|,|A^-|<|S|\),因为 \(x\notin A^+,y\notin A^-\)。
- 对于 \(\forall x\in A\),\(x\) 是 \(A^-\) 中一条链的结尾,也是 \(A^+\) 中一条链的开头。
\(A^+,A^-\) 满足归纳假设,其最小链覆盖大小为 \(p\)。那么对于每个 \(A\) 中的 \(x\),我们把 \(x\) 两边的链拼起来得到一条 \(S\) 的链。这些链共同构成 \(S\) 的最小链覆盖,于是命题对于 \(S\) 成立。
证明 2:
设 \(S\) 的最长反链大小 为 \(P\),最小链覆盖大小为 \(Q\)。
首先有 \(P\leq Q\),因为每条链至多包含最长反链中的一个元素。
那么如果能构造出大小为最小链覆盖的反链,命题就成立。
我们将最小链覆盖中每个链的 “终点” 拿出来放到集合 \(X\) 中。再设 \(Y=\{x|x\in S\land (\exists y\in X,y\leq x)\}\)。
设 \(Z=X\cap Y\)。
如果 \(Z=\varnothing\),我们就得到了构造方案。
否则,我们拿出 \(Z\) 中的一个元素 \(x\),将其沿着它所在的链 “向上” 找,找到第一个 \(x_0\notin Z\)。将 \(x\) 从 \(X\) 中删除,并将 \(x_0\) 加入 \(X\) 中。重复以上过程,直到 \(Z=\varnothing\)。
下面来证明这样的 \(x_0\) 一定存在。考虑一条链,设其为 \(C\),其 “起点” 为 \(p\)。若 \(p\in Z\),那么 \(\exists y\in X,y\leq p\)。
设 \(y\) 位于链 \(C'\) 中。分情况讨论:
-
\(y\) 是 \(C'\) 的 “终点”。那么 \(C,C'\) 可以拼起来从而使链覆盖大小减少一,矛盾;
-
\(y\) 不是 $C' $ 的 “终点”。将 \(y\) 与 \(p\) 连接起来得到新链,让 \(y\) 的 "下一个元素" \(z\) 成为 \(C'\) 的 “起点”。
由于 \(y\) 是由 \(z\) 移动而来,所以一定 \(\exists u\in X, u\neq y,u\leq z\)。
令 \(p\leftarrow z\),\(y\leftarrow u\),重复上述过程,直到 \(y\) 成为某个链的终点。 这样的 \(y\) 一定能在有限次内找到,否则成环。
所以对于每个链的 “起点”,一定不在集合 \(Z\) 中。所以最坏的情况是一直移动到 “起点”,这样的 \(x_0\) 一定能找到。
于是按照上面的方案,一定能够在有限次数内找到构造方案。命题得证。
Problem P4298 祭祀
题意可以转化为:求给定偏序集的最大反链大小,给出一组构造,并判断每个元素是否被至少一个最大反链包含。
由 Dilworth 定理,最大反链大小等于最小链覆盖大小。这个最小链覆盖即为拆点二分图 \(G\) 的最大匹配。
对于元素 \(x\),\(x\) 就至少被一个最大反链包含,当且仅当若删除所有 \(y\leq x\lor x\leq y\) 的元素后,最大反链大小只减小了 \(1\)。对每个 \(x\) 跑一遍最大匹配即可。
用匈牙利算法实现,时间复杂度 \(O(n^4)\)。
int n,m;
bool e[N][N];
bool vis[N],del[N];
int mch[N],pre[N],ans;
bool chs[N],able[N],mrk[N];
bool dfs(int x){
for(int y=1;y<=n;y++){
if(!e[x][y]||vis[y]||del[y]) continue;
vis[y]=1;
if(!mch[y]||dfs(mch[y])){
mch[y]=x;
return 1;
}
}
return 0;
}
int Solve(){
memset(mch,0,sizeof(mch));
int cnt=0;
for(int i=1;i<=n;i++) cnt+=(!del[i]);
for(int i=1;i<=n;i++){
if(del[i]) continue;
memset(vis,0,sizeof(vis));
cnt-=dfs(i);
}
return cnt;
}
signed main(){
read(n),read(m);
for(int i=1;i<=m;i++){
int u,v;
read(u),read(v);
e[u][v]=1;
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
e[i][j]|=(e[i][k]&e[k][j]);
}
ans=Solve();
for(int i=1;i<=n;i++) mrk[mch[i]]=1;
for(int i=1;i<=n;i++)
if(!mrk[i]) chs[i]=1;
while(1){
bool ok=1;
for(int i=1;i<=n;i++){
if(!chs[i]) continue;
for(int j=1;j<=n;j++)
if(e[i][j]&&chs[j]){
ok=0;
chs[j]=0,chs[mch[j]]=1;
}
}
if(ok) break;
}
printf("%d\n",ans);
for(int i=1;i<=n;i++) putchar(chs[i]+'0');
puts("");
for(int i=1;i<=n;i++){
memset(del,0,sizeof(del));
del[i]=1;
for(int j=1;j<=n;j++)
if(e[i][j]||e[j][i]) del[j]=1;
able[i]=(Solve()==ans-1);
}
for(int i=1;i<=n;i++) putchar(able[i]+'0');
puts("");
return 0;
}
还有另外一种构造方式:
考虑 \(G\) 的最大独立集 \(A\)。设 \(B=\{x|x_{in}\in A\land x_{out}\in A\}\),\(B\) 即为要求的最大反链。
首先证明 \(B\) 是反链。考虑反证法,若存在一对 \(x,y\in B\) 有连边,那么 \(x,y\) 至少有一个不会被加入独立集。
然后证明 \(B\) 是最大的。设原图点数为 \(n\),那么 \(G\) 的点数为 \(2n\)。再设 \(G\) 的最大匹配大小为 \(m\)。
由最大反链等于最小链覆盖等于 \(n-m\),得到 \(|B|\leq n-m\)。
设 \(C=A\setminus B\)。由定义,\(C\) 对应所有 \(x_{in}\in A\lor x_{out}\in A\) 的 \(x\),那么 \(|C|=|A|-|B|\leq n\)。又因为 \(|A|=2n-m\),得到 \(2n-m-|B|\leq n\),最后得到 \(|B|\geq n-m\)。
综上,\(|B|=n-m\),即 \(B\) 为最大反链。

浙公网安备 33010602011771号