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

2021-10-05 22:08:25 字數 3231 閱讀 4749

對於分支限界,其實思想和回溯很像,只是具體的實現方法不一樣。回溯用到遞迴,是深度優先搜尋;分支限界是用最大堆進行迴圈,是廣度優先搜尋。

1.最大團問題:

給出乙個無向連通圖,求出其最大完全子圖的節點數:

分析:每乙個節點進行分析,如果可以放進去,則定為1,放入左節點,要是不能放進去,則定為0,放入右節點。

此處用分支限界思想,沒有上界,下界為bestn,關鍵值cn + n - t,記錄(t, cn, x)

int bestn =0;

//bestn是當前完全子圖節點數目的最大值

int cn =0;

//cn是當前放進去的節點的總數

int key =0;

int t =1;

int x[

105]

;memset

(x,0

,sizeof

(x))

;std::priority_queue q;

q.push

(node

(t,cn,x)

;while

(!q.

empty()

)if(cn + n - t >= bestn)

//判定條件是剩下的值全加上去是不是還有bestn大,如果有的話,不要當前的t節點,存入優先佇列中;

q.push

(ndoe

(key -

1, t +

1, cn, x));

//如果不取這個值,key值減一,cn值不變;

}

完整**如下(親測有效吼吼吼):

#include

#include

#include

#include

using

namespace std;

int n;

struct node

;node

(int a,

int b,

int c,

int x)

bool

operator

<

(const node &a)

const

} queue[

105]

;int x[

105]

;int

main()

priority_queue q;

int key =0;

int cn =0;

int t =1;

int bestn =0;

q.push

(node

(key, cn, t, x));

while

(!q.

empty()

)}if(flag ==0)

}if(cn + n - t > bestn)

q.push

(node

(cn + n - t, cn, t +

1, x));

}printf

("%d\n"

, bestn)

;system

("pause");

return0;

}

2.0-1揹包問題

0-1揹包問題是乙個很熟悉的問題了,前面的部落格有討論過這個問題的動態規劃、貪心、回溯解法,這裡我們再來**一下它的分支限界解法:

分支限界實際上是需要找到上界,下界,關鍵值,找出記錄點。在0-1揹包問題中,題目給出的條件是w[1:n],v[1:n],c;需要求出的是bestv,需要記錄的是cw,cv,t,key值用cv + r:

int r =

sum(v[

1:n]);

int bestv =0;

;int cw =0;

int cv =0;

int t =1;

int key = r;

std::priority_queue q;

q.push

(node

(key,t,cw,cv,r));

while

(!q.

empty()

) q.

push

(node

(key, t +

1, cw + w[t]

, cv + v[t]

, r));

}if(cv + r >= bestv)

q.push

(node

(key - v[i]

, t +

1, cw, cv, r));

}

完整**如下(親測有效吼吼吼):

#include

#include

#include

struct node

;node

(int a,

int b,

int c,

int d,

int e)

bool

operator

<

(const node &a)

const};

intmain()

scanf

("%d"

,&c)

;int bestv =0;

int cw =0;

int cv =0;

int t =1;

int key = r;

std::priority_queue q;

q.push

(node

(key, t, cw, cv, r));

while

(!q.

empty()

) q.

push

(node

(key, t +

1, cw + w[t]

, cv + v[t]

, r));

}if(cv + r >= bestv)

q.push

(node

(key - v[i]

, t +

1, cw, cv, r));

}printf

("%d\n"

, bestv)

;system

("pause");

return0;

}

分支限界 最大團問題

給定有乙個無向圖,找出最大團個數。最大團也就是該圖中最大的完全圖 各頂點之間都有邊 演算法思想 設p為所有點集的集合,依次取出p中的頂點作為團的起始點,也就是以該點為起點開始拓展,每次檢視相鄰頂點是否與團內各點聯通,若true,則加入該點。為了進一步降低時間複雜度,採取記憶化遞迴的方式,從後向前遍歷...

最大團問題 分支限界

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

分支限界法01揹包問題 01揹包問題

1.01揹包問題的描述 有n個不可分割的物品,它們有各自的重量和價值,現有固定容量的揹包,選擇把哪些物品放入揹包可以讓揹包中物品的價值最大。2.錯覺 按照價值和重量的比值 價效比 進行排序,依次嘗試放入直到放不進揹包為止。但是細想思考一下就能發現,這個貪心演算法是有問題的,看下面乙個例子。揹包容量1...