1. 程式人生 > 其它 >一般圖最大獨立集/最大團問題

一般圖最大獨立集/最大團問題

一般圖最大獨立集/最大團問題

眾所周知,一般圖最大獨立集/最大團問題是 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 年鍾知閒論文