图中最大独立集的递归程序

时间:2011-07-23 07:23:35

标签: c++ python c algorithm data-structures

我在为上述问题编写程序时遇到困难。我有以下图表....

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}... 

图表的邻接矩阵如下: -

Adjacency Matrix

为了解决问题,我绘制了以下决策树: -

Recursion Tree

  • 每个节点的第一个元素是索引。
  • 每个节点的第二个元素是存储图的独立元素的集合。

  • 左侧分支表示我不会考虑该元素,右侧分支表示我将考虑该节点的第一个元素指定的索引处的元素。

因此,您可以清楚地看到,在每个节点上,我都没有考虑过该节点的第一个元素索引所指定的元素,并且我已经考虑了该元素是否可以插入到独立集合中。

我想用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)

2 个答案:

答案 0 :(得分:3)

有一个众所周知的简单算法来解决这个问题:

  1. 最初为所有顶点着色为绿色。
  2. 找到一个绿色顶点。把它的邻居染成红色。
  3. 对于每个红色顶点,颜色为绿色邻居为红色。 (这是递归部分)
  4. 当没有更多具有绿色邻居的红色顶点时,红色顶点集确定最大连通分量。
  5. 从2开始重复,直到所有顶点都是红色并且发现所有组件。
  6. 现在您已了解所有组件,您可以选择具有最多顶点的组件(即最高顺序最大连接的子图)。

答案 1 :(得分:0)

至于你的代码:

  1. 它有一个严重错误:永远不会复制set。通常没关系,但事实并非如此。我们来看看你的代码。在计算without_i之后,可以修改原始设定值。在这种情况下,with_i的计算使用不正确的设定值。我能想象的最简单的例子是tab = [[0,1,0],[1,0,0],[1,0,0]]

  2. 轻微错误:flag未使用?似乎还创建了numcalls以简化调试。所以我在我的代码示例中将其排除。

  3. 在我看来,你的功能界面不方便。用户必须创建自己的set变量并手动指定问题大小。所以在我的代码示例中,我将原始函数包装到我想要使用的接口中。实际上你可以进一步探索邻接声明的方式。例如,邻接列表可能比矩阵更方便。

  4. 我的代码示例:

    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