一般图最大独立集/最大团问题

一般图最大独立集/最大团问题

众所周知,一般图最大独立集/最大团问题是 NP-Hard 的,目前不存在多项式时间的算法,但存在一些复杂度较优的指数级算法

本文主要介绍基于 极大独立集 搜索的 Bron-Kerbosch 算法

Bron-Kerbosch 算法

对于最大独立集问题,由于最大独立集显然为极大独立集,BK 算法考虑搜索极大独立集

BK 算法过程中以三个集合 \(R,P,X\) 为状态,调用 \(\text{Bron-Kerbosch}(R,P,X)\),可以得到图的包含所有 \(R\) 中结点、\(P\) 中若干结点且不包含 \(X\) 中结点的全部极大独立集

值得一提的是,实现时可以使用大整数压位存储集合

该算法的灵魂在于 Pivoting

算法过程中,我们需要选取一个结点 \(u\in P\cup X\),最小化 \(|P\cap(\{u\}\cup N(u))|\)

\(u\) 称为 Pivot 结点,然后枚举 \(\{u\}\cup N(u)\) 中加入独立集 \(R\) 的第一个结点 \(v\) 递归到子问题

Pivoting 的正确性?

定理:无向图 \(G\) 的任意极大独立集 \(I\) 满足,对于任意一个结点 \(u\)\(I\cap(\{u\}\cup N(u))\neq \varnothing\)

证明显然,考虑反证,极大独立集 \(I\) 可以加入 \(u\)

void BK(ll r,ll p,ll x){
	if(!p&&!x){mx=max(mx,popcnt(r));return ;}
	int z=n+1,u=-1;
	ll st=p|x;
	for(int i=0;i<n;i++){
		if(!((st>>i)&1))continue;
		int w=popcnt(p&N[i]);
		if(w<z)z=w,u=i;
	}
	st=p&N[u];
	for(int i=0;i<n;i++){
		if(!((st>>i)&1))continue;
		BK(r|(1ll<<i),p^(p&N[i]),x^(x&N[i]));
		p^=(1ll<<i),x|=(1ll<<i);
	}
	return ;
}

极大独立集个数

BK 算法的递归上界为 \(O(3^{n/3})\) ,那么我们可以知道 \(n\) 点无向图的极大独立集个数上界为 \(O(3^{n/3})\)

事实上这个上界也是一个确界,可以通过构造 \(\lfloor \dfrac n 3\rfloor\) 个相互独立的三元环达到

在图随机的情况下,这个上界是很松的,下图中 \(E(x)\) 为极大独立集个数的期望

参考文献

本文摘录自 国家集训队 2017 年钟知闲论文

posted @ 2022-05-17 21:30  juju527  阅读(694)  评论(0编辑  收藏  举报