0037算法笔记分支限界法最大团问题Word格式.docx
- 文档编号:13671763
- 上传时间:2022-10-12
- 格式:DOCX
- 页数:12
- 大小:44.03KB
0037算法笔记分支限界法最大团问题Word格式.docx
《0037算法笔记分支限界法最大团问题Word格式.docx》由会员分享,可在线阅读,更多相关《0037算法笔记分支限界法最大团问题Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
的空子图,但它不是G'
的独立集,因为它包含在G'
的空子图{1,2,5}中。
{1,2,5}是G'
{1,4,5}和{2,3,5}也是G'
算法设计
最大团问题的解空间树也是一棵子集树。
子集树的根结点是初始扩展结点,对于这个特殊的扩展结点,其cliqueSize的值为0。
算法在扩展内部结点时,首先考察其左儿子结点。
在左儿子结点处,将顶点i加入到当前团中,并检查该顶点与当前团中其它顶点之间是否有边相连。
当顶点i与当前团中所有顶点之间都有边相连,则相应的左儿子结点是可行结点,将它加入到子集树中并插入活结点优先队列,否则就不是可行结点。
接着继续考察当前扩展结点的右儿子结点。
当upperSize>
bestn时,右子树中可能含有最优解,此时将右儿子结点加入到子集树中并插入到活结点优先队列中。
算法的while循环的终止条件是遇到子集树中的一个叶结点(即n+1层结点)成为当前扩展结点。
对于子集树中的叶结点,有upperSize=cliqueSize。
此时活结点优先队列中剩余结点的upperSize值均不超过当前扩展结点的upperSize值,从而进一步搜索不可能得到更大的团,此时算法已找到一个最优解。
算法具体实现如下:
1、MaxHeap.h
[cpp]
viewplain
copy
1.template<
class
T>
2.class
MaxHeap
3.{
4.
public:
5.
MaxHeap(int
MaxHeapSize
=
10);
6.
~MaxHeap()
{delete
[]
heap;
}
7.
int
Size()
const
{return
CurrentSize;
8.
9.
T
Max()
10.
{
//查
11.
if
(CurrentSize
==
0)
12.
13.
throw
OutOfBounds();
14.
15.
return
heap[1];
16.
17.
18.
MaxHeap<
&
Insert(const
T&
x);
//增
19.
DeleteMax(T&
//删
20.
21.
void
Initialize(T
a[],
size,
ArraySize);
22.
23.
private:
24.
CurrentSize,
MaxSize;
25.
*heap;
//
element
array
26.};
27.
28.template<
29.MaxHeap<
:
MaxHeapSize)
30.{//
Max
heap
constructor.
31.
MaxSize
MaxHeapSize;
32.
new
T[MaxSize+1];
33.
CurrentSize
0;
34.}
35.
36.template<
37.MaxHeap<
x)
38.{//
Insert
x
into
the
max
heap.
39.
MaxSize)
40.
41.
cout<
<
"
no
space!
endl;
42.
*this;
43.
44.
45.
寻找新元素x的位置
46.
i——初始为新叶节点的位置,逐层向上,寻找最终位置
47.
i
++CurrentSize;
48.
while
(i
!
1
>
heap[i/2])
49.
50.
i不是根节点,且其值大于父节点的值,需要继续调整
51.
heap[i]
heap[i/2];
父节点下降
52.
/=
2;
继续向上,搜寻正确位置
53.
54.
55.
x;
56.
57.}
58.
59.template<
60.MaxHeap<
61.{//
Set
to
and
delete
from
62.
check
is
empty
63.
64.
65.
Empty
heap!
66.
67.
68.
69.
删除最大元素
70.
重整堆
71.
y
heap[CurrentSize--];
取最后一个节点,从根开始重整
72.
73.
find
place
for
starting
at
root
74.
1,
current
node
of
75.
ci
child
76.
77.
(ci
CurrentSize)
78.
79.
使ci指向i的两个孩子中较大者
80.
heap[ci]
heap[ci+1])
81.
82.
ci++;
83.
84.
y的值大于等于孩子节点吗?
85.
(y
heap[ci])
86.
87.
break;
是,i就是y的正确位置,退出
88.
89.
90.
否,需要继续向下,重整堆
91.
heap[ci];
大于父节点的孩子节点上升
92.
ci;
向下一层,继续搜索正确位置
93.
*=
94.
95.
96.
y;
97.
98.}
99.
100.template<
101.void
size,int
ArraySize)
102.{//
Initialize
a.
103.
104.
a;
105.
size;
106.
ArraySize;
107.
108.
从最后一个内部节点开始,一直到根,对每个子树进行堆重整
109.
(int
CurrentSize/2;
1;
i--)
110.
111.
heap[i];
子树根节点元素
112.
put
113.
c
2*i;
parent
target
114.
location
115.
(c
116.
117.
heap[c]
should
be
larger
sibling
118.
heap[c+1])
119.
120.
c++;
121.
122.
can
we
in
heap[c/2]?
123.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 0037 算法 笔记 分支 限界 大团 问题