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