分支限界 最大團問題

2021-10-11 19:10:18 字數 985 閱讀 4978

給定有乙個無向圖,找出最大團個數。

最大團也就是該圖中最大的完全圖(各頂點之間都有邊)。

演算法思想:設p為所有點集的集合,依次取出p中的頂點作為團的起始點,也就是以該點為起點開始拓展,每次檢視相鄰頂點是否與團內各點聯通,若true,則加入該點。

為了進一步降低時間複雜度,採取記憶化遞迴的方式,從後向前遍歷頂點,用cnt陣列記錄該點以後所成最大團的個數,以此知該點的潛力,達到剪枝的效果。

#include

using

namespace std;

#define maxm 55

int g[maxm]

[maxm]

;//存圖

int vis[maxm]

;//存放已選擇的點

int cnt[maxm]

;//cnt[i]表示用編號》=i的點能組成的最大團的點數

int ans, n;

bool

dfs(

int cur,

int num)

if(ok)}}

ans =

max(ans, num)

;return

(ans ==

max(num, ans)?0

:1);

}void

maxclique()

}int

main()

maxclique()

; cout << cnt[1]

;return0;

}/*51 1 0 1 1

1 1 1 0 1

0 1 1 0 1

1 0 0 1 1

1 1 1 1 1

*/

最大團問題 分支限界

問題描述 給定無向圖g v,e 其中 v是非空集合,稱為頂點集 e是 v中元素構成的無序二元組的集合,稱為邊集,無向圖中的邊均是頂點的無序對,無序對常用圓括號 表示。如果u v,且對任意兩個頂點u,v u有 u,v e,則稱u是 g的完全子圖。g的完全子圖u是 g的團當且僅當 u不包含在 g的更大的...

最大團問題 0 1揹包 再談分支限界

對於分支限界,其實思想和回溯很像,只是具體的實現方法不一樣。回溯用到遞迴,是深度優先搜尋 分支限界是用最大堆進行迴圈,是廣度優先搜尋。1.最大團問題 給出乙個無向連通圖,求出其最大完全子圖的節點數 分析 每乙個節點進行分析,如果可以放進去,則定為1,放入左節點,要是不能放進去,則定為0,放入右節點。...

最大團問題

include cstdio include queue include cstring define max 20 using namespace std int n 城市數量 int x max 解向量 struct node priority queuepq void enqueue int ...