我在为上述问题编写程序时遇到困难。我有以下图表....
A-----B------C D
A is connected to B
B is connected to C
D is connected with no body!!
The maximum Independent set in this is {A,C, D}...
图表的邻接矩阵如下: -
为了解决问题,我绘制了以下决策树: -
每个节点的第二个元素是存储图的独立元素的集合。
左侧分支表示我不会考虑该元素,右侧分支表示我将考虑该节点的第一个元素指定的索引处的元素。
因此,您可以清楚地看到,在每个节点上,我都没有考虑过该节点的第一个元素索引所指定的元素,并且我已经考虑了该元素是否可以插入到独立集合中。
我想用Python编写一个程序!我是一个新手,并且还处于通过递归实现程序的早期阶段。
请帮助!!
我写了下面的代码: - 但它对我来说看起来并不好..它以某种方式工作..请经验人们可以提出你的意见..我还在学习递归..
def maxset(tab, i, set):
global numcalls
numcalls += 1
if i == 0:
flag = 0
for s in set:
if tab[i][s]:
return 0
if i not in set:
set.append(i)
return len(set)
without_i = maxset(tab, i-1, set)
flag = 0
for s in set:
if tab[i][s]:
return without_i
if i not in set:
set.append(i)
with_i = maxset(tab,i-1,set)
return max(without_i, with_i)
tab = [[0,1,0,0],[1,0,1,0],[0,1,0,0],[0,0,0,0]]
#tab = [[0,1,0,0,0],[1,0,1,1,0],[0,1,0,1,0],[0,1,1,0,1],[0,0,0,1,0]]
set = []
numVertIndex = 3 #### 0,1,2,3
numcalls = 0
print(maxset(tab, numVertIndex, set))
print(set)
print (numcalls)
答案 0 :(得分:3)
有一个众所周知的简单算法来解决这个问题:
现在您已了解所有组件,您可以选择具有最多顶点的组件(即最高顺序最大连接的子图)。
答案 1 :(得分:0)
至于你的代码:
它有一个严重错误:永远不会复制set
。通常没关系,但事实并非如此。我们来看看你的代码。在计算without_i
之后,可以修改原始设定值。在这种情况下,with_i
的计算使用不正确的设定值。我能想象的最简单的例子是tab = [[0,1,0],[1,0,0],[1,0,0]]
。
轻微错误:flag
未使用?似乎还创建了numcalls
以简化调试。所以我在我的代码示例中将其排除。
在我看来,你的功能界面不方便。用户必须创建自己的set
变量并手动指定问题大小。所以在我的代码示例中,我将原始函数包装到我想要使用的接口中。实际上你可以进一步探索邻接声明的方式。例如,邻接列表可能比矩阵更方便。
我的代码示例:
def maxset( tab ):
def maxset_detail(tab, i, set):
if any( tab[i][s] for s in set ):
return i and maxset_detail(tab, i-1, set) or 0
if (i == 0):
set.append(i)
return len(set)
set_copy = set[:] + [i]
without_i = maxset_detail(tab, i-1, set)
with_i = maxset_detail(tab, i-1, set_copy)
if ( with_i > without_i ):
set[:] = set_copy
return with_i
else:
return without_i
set = []
maxset_detail(tab, len(tab)-1, set )
return set