【发布时间】:2017-10-22 13:23:51
【问题描述】:
我正在尝试用组合数学和图形解决相当复杂的问题:
Given 是一个有 n (nm (ma,b的格式表示,其中a,b都是图中的节点。 p>
现在在这个图中,我们必须计算节点的所有子集,显然有 2^n 个子集,但是我们在每个子集组合中都有一个限制,我们不应该有三个节点正在形成三角形,我们不应该计算这些组合,换句话说,我们不应该计算包含长度为 3 的节点的组合。
示例
n=3, m=3 我们有图 2-1, 3-1, 2-3 ,这个例子的答案是 7,我们可以形成的所有子集是:{}、{1}、{2}、{3}、{1,2}、{1,3}、 {2,3},但是我们不应该计算子集 {1,2,3},因为节点 1,2,3 正在形成三角形,换句话说,它们正在形成长度为 3 的循环
我的尝试
我用正确的答案解决了这个问题,但它只在 nn) 生成所有可能的位掩码复杂性,但这种复杂性对于 n=30 来说太大了。我应该在我的算法中添加什么以使其适用于所有测试用例?
【问题讨论】:
-
你知道有多少子集。如果你找到一个三角形,有多少个子集包含这个三角形?如果你找到两个三角形,有多少个子集包含这两个三角形?
-
查找所有三角形,而不是为每个节点存储它所在的三角形(足以存储具有最大索引的节点的其他三角形节点),并且通过检查任何三角形中的节点和回溯查找组合是否已经选择了其他两个三角形节点。
-
@Ante 你能解释一下回溯部分吗,因为我不太了解你,因为有 30 个节点,我认为回溯的复杂度为 2^30
-
@someone12321 我误解了问题,我认为问题是打印所有子集,而不仅仅是子集的数量。我删除了我的答案。如 m69 所述,您需要 inclusion–exclusion principle A_i 是包含三角形 i 的子集。问题是求和存在于三角形的每个子集上,它可能比所有节点子集的数量大得多。每个和的类型为 |intersection A_x| = 2^(n-number_of_different_nodes_in_trias),可以用来简化求和。
-
@someone12321 它有效 :-) 最简单的方法是只检查一个三角形。比解决方案是|S| - |A_1| = 2^n - 2^(n-3)。这包括具有一个或两个三角形节点的子集。
标签: algorithm graph combinatorics