【问题标题】:program of Recursion for Maximum Independent Set in a Graph图中最大独立集的递归程序
【发布时间】:2011-07-23 07:23:35
【问题描述】:

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

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为此编写一个程序!!我是一个新手,还处于通过递归实现程序的早期阶段。

请帮忙!!

我编写了以下代码:- 但它对我来说看起来不太好.. 它以某种方式工作.. 请体验人们可以放入您的 cmets.. 我仍在学习递归..

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)

【问题讨论】:

  • 先尝试求解最大团。

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


【解决方案1】:

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

  1. 最初将所有顶点着色为绿色。
  2. 找到一个绿色顶点。将它的邻居涂成红色。
  3. 对于每个红色顶点,将其与绿色相邻的红色着色。 (这里是递归部分)
  4. 当没有更多红色顶点与绿色邻居时,红色顶点集确定最大连通分量。
  5. 从 2 开始重复,直到所有顶点都变为红色并发现所有组件。

既然您知道所有组件,您可以选择具有最多顶点的一个(即最高阶最大连通子图)。

【讨论】:

  • 是的,有最简单的算法可用..但我首先尝试解决这个问题,以便我有一些方便的解决方案..然后会去解决复杂的问题!你能提供我上面提到的代码吗?我在编写递归代码时遇到了困难! :(
  • 发布您尝试过但不起作用的代码,然后人们可以提供帮助。不要让别人为你写代码。
  • 我已经发布了我刚刚完成的代码....请提供意见,我该如何改进它?
  • @DeepYellow OP 询问的是最大独立集(对集团),而不是连接组件。对于 OP 的要求,没有已知的多项式算法。
【解决方案2】:

至于你的代码:

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

  2. 小错误:flag 未使用?另外numcalls 似乎是为了简化调试而创建的。所以我在我的代码示例中排除了它。

  3. 在我看来,你的函数接口不方便。用户必须创建自己的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2012-09-27
    相关资源
    最近更新 更多