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