偏序与偏序集 - 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)\}\)

容易得到一些性质:

  1. \(A^+\cup A^-=S\)
  2. \(A^+\cap A^-=A\)
  3. \(|A^+|,|A^-|<|S|\),因为 \(x\notin A^+,y\notin A^-\)
  4. 对于 \(\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'\) 中。分情况讨论:

  1. \(y\)\(C'\) 的 “终点”。那么 \(C,C'\) 可以拼起来从而使链覆盖大小减少一,矛盾;

  2. \(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\) 为最大反链。

posted @ 2025-06-21 19:39  XP3301_Pipi  阅读(53)  评论(0)    收藏  举报
Title