Bron Kerbosch演算法 最大獨立集與最大團

2022-05-13 20:58:12 字數 3273 閱讀 3653

---恢復內容開始---

bron

-kerbosch

演算法計算圖的最大全連通分量(團clique) 

最大獨立集: 頂點集v中取 k個頂點,其兩兩間無連線。

最大團: 頂點集v中取 k個頂點,其兩兩間有邊連線。

最大團中頂點數量 = 補圖的最大獨立集中頂點數量

補圖定義: 

g = 

the complement of g, \bar = 

詳見連線:  

更詳細的: 

就可以通過求其補圖中最大團中頂點數量,就可得出原圖中最大獨立集中頂點數量了.

對於求解 最大團中頂點數量 的搜尋過程中用到的剪枝,如下

1

. 剪枝1:常用的指定順序, 即列舉第i個頂後, 以後再列舉時枝考慮下標比大它的, 避免重複。

2. 剪枝2:自己開始從前往後的列舉頂點, tle兩次. 後來從後往前列舉頂點,發現可以利用頂點之間的承襲性.我用num[i] 記錄的可選頂點集合為 v[i, i+1, ... , n] 中的最大團數目, 目標是求num[1

].     分析易知, num[i] = num[i+1] 或者 num[i]+1   (num[1

...n] 具有非降的單調性,從後往前求)

由這個式子以及num資訊的記錄,使得我們可以增加兩處剪枝:

3.上/下剪枝:假設當前列舉的是頂點x, 它的第乙個鄰接頂是i (標號一定比x大,即num[i]已經求出) 我們可以知道, 若 1 + num[i] <=best, 那麼是沒沒要往下列舉這個頂點x了,因為包含它的團是不可能超過我們目前的最優值的。

4. 立即返回剪枝: 由於num[i]最大可能為num[i+1]+1, 所以在列舉頂點i時,只要一更新best,可知此時的num[i]就為num[i+1]+1了,不需要再去嘗試找其他的方案了,所以應立即返回.

比較容易理解得c/c++**:

#include#include

#include

intbest;

intnum[maxn];

//int x[maxn];

intpath[maxn];

intg[maxn][maxn], n;

bool dfs( int *adj, int total, int cnt )

return

false

; }

for( i = 0; i < totl; i++)

return

false;}

intmaximumclique()

return

best;

}

關於 bron-kerbosch演算法

基礎形式是乙個遞迴回溯的搜尋演算法.通過給定三個集合 (r,p,x).

初始化集合r,x分別為空,而集合p為所有頂點的集合.

而每次從集合p中取頂點, 當集合中沒有頂點時,兩種情況.

1.  集合 r 是最大團, 此時集合x為空.

2.  無最大團,此時回溯.

對於每乙個從集合p中取得得頂點,有如下處理:

1. 將頂點加到集合r中, 集合p,x 與 頂點得鄰接頂點集合 n相交, 之後遞迴集合 r,p,x

2. 從集合p中刪除頂點,並將頂點新增到集合x中.

若 集合 p,x都為空, 則集合r即為最大團.

總的來看就是每次從 集合p中取v後,再在 p∩n 集合中取,一直取相鄰,保證集合r中任意頂點間都兩兩相鄰...

偽**過程:

bronkerbosch1(r,p,x):

ifp and x are both empty:

report r

asa maximal clique

for each vertex v in

p: bronkerbosch1(r ⋃ , p ⋂ n(v), x ⋂ n(v))

p :=p \

x := x ⋃

對於這個基礎的演算法,效率不高,因為其遞迴搜尋了所有情況,其中有些不是最大團的也進行了搜尋.

為了節省時間和讓演算法更快的回溯,我們可以通過設定關鍵點'pivot',通過簡單分析,我們知道.

對於任意的最大團,其必須包括頂點或者non-n,(反面關係).不然其必然需要通過新增它們來進行擴充,這顯然矛盾.所以.我們僅僅需要測試 頂點以及 non-n即可.這樣可以節省遞迴的時間.

偽**過程

bronkerbosch2(r,p,x):

ifp and x are both empty:

report r

asa maximal clique

choose a pivot vertex u

inp ⋃ x

for each vertex v in

p \ n(u):

bronkerbosch2(r ⋃ , p ⋂ n(v), x ⋂ n(v))

p :=p \

x := x ⋃

疑問,若 p \ n(u) 為空, 則所有頂點皆與u相鄰,則此時應該將u加入最大團則為最優...

因為通過選擇特殊點,是演算法最小化遞迴呼叫,所以一定程度上節省了時間.

其實這裡也可以用特殊點結合起來,效果會更優.

最大團.

偽**過程

bronkerbosch3(g):

p =v(g)

r = x =empty

for each vertex v in

a degeneracy ordering of g:

bronkerbosch2(r ⋃ , p ⋂ n(v), x ⋂ n(v))

p :=p \

x := x ⋃

---恢復內容結束---

第三類優化模板 c/c++實現: 

#include#include

#define n 1010

bool

flag[n], a[n][n];

intans, cnt[n], group[n], n, vis[n];

//最大團: v中取k個頂點,兩點間相互連線

//最大獨立集: v中取k個頂點,兩點間不連線

//最大團數量 = 補圖中最大獨立集數

bool dfs( int u, int

pos )

}}

if( pos >ans )

return0;

} void

maxclique()

}

GBDT演算法(最簡單)

3.gbdt的優點和侷限性有哪些?4.rf 隨機森林 與gbdt之間的區別與聯絡 5.實現 gbdt gradient boosting decision tree 全名叫梯度提公升決策樹,使用的是boosting的思想。boosting方法訓練基分類器時採用序列的方式,各個基分類器之間有依賴。它的...

K 最鄰近演算法總結

1.基本介紹 k最近鄰 k nearest neighbor,knn 分類演算法,是乙個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是 如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。knn演算法中,所選擇的鄰居...

rmq ST演算法(矩陣最值)

已知某矩陣中的值已經確定,需求矩陣中某個小矩陣的最值 st演算法 我們可以將每一行看作一維的rmq maxx i j k 表示 第i行 j,j 1模板 include include include using namespace std const int n 1e3 7 const int in...