---恢復內容開始---
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...