0037算法笔记分支限界法最大团问题Word文档格式.docx

上传人:b****2 文档编号:15232760 上传时间:2022-10-28 格式:DOCX 页数:12 大小:43.86KB
下载 相关 举报
0037算法笔记分支限界法最大团问题Word文档格式.docx_第1页
第1页 / 共12页
0037算法笔记分支限界法最大团问题Word文档格式.docx_第2页
第2页 / 共12页
0037算法笔记分支限界法最大团问题Word文档格式.docx_第3页
第3页 / 共12页
0037算法笔记分支限界法最大团问题Word文档格式.docx_第4页
第4页 / 共12页
0037算法笔记分支限界法最大团问题Word文档格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

0037算法笔记分支限界法最大团问题Word文档格式.docx

《0037算法笔记分支限界法最大团问题Word文档格式.docx》由会员分享,可在线阅读,更多相关《0037算法笔记分支限界法最大团问题Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。

0037算法笔记分支限界法最大团问题Word文档格式.docx

的空子图,但它不是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. 

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 

into 

the 

max 

heap. 

39. 

MaxSize) 

40. 

41. 

cout<

<

"

no 

space!

endl;

42. 

*this;

43. 

44. 

45. 

寻找新元素x的位置 

46. 

i——初始为新叶节点的位置,逐层向上,寻找最终位置 

47. 

++CurrentSize;

48. 

while 

(i 

!

>

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. 

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. 

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. 

heap[c]) 

124. 

125. 

yes 

126. 

1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1