确定给定图形是否是其他图形的子图的简单方法?

时间:2010-03-02 02:06:45

标签: algorithm graph graph-theory directed-acyclic-graphs subgraph

我正在寻找一种算法来检查给定的图是否是另一个给定图的子图。

我没有什么条件可以使这个NP完全问题更可行..

  • 图表大约有<20个顶点。
  • 图表是DAG。
  • 所有顶点都是非唯一标注的,主图和子图中的对应顶点应该具有相同的标签。我不知道我是否使用了正确的术语(因为我没有采用图论理论课程......)。它将类似于:

线图A - B是A - B - A的子图,但A - A不是A - B - A的子图。

任何建议都没问题。这不是一个功课问题顺便说一下。 :d

3 个答案:

答案 0 :(得分:2)

如果标签是唯一的,对于尺寸为N的图表,假设在每对顶点之间没有自循环或多个边,则会有O(N^2)个边。我们使用E作为边数。

如果在父图中散列设定边,则可以遍历子图的边,检查每个边是否在哈希表中(如果需要,可以是正确的数量)。因此,您为每个边缘执行此操作一次O(E)

让我们调用图G(带N个顶点)和可能的子图G_1(带M个顶点),并且想要找到G_1 is in G

由于标签不是唯一的,因此您可以使用动态编程来构建子问题 - 而不是每个子图一个O(2^N)个子问题,您有O(M 2^N)个子问题 - 一个用于每个顶点G_1(带M个顶点)与每个可能的子图。

G_1 is in G = isSubgraph( 0, empty bitmask)

并且州设置如下:

isSubgraph( index, bitmask ) =
   for all vertex in G
       if G[vertex] is not used (check bitmask)
          and G[vertex]'s label is equal to G_1[index]'s label
          and isSubgraph( index + 1, (add vertex to bitmask) )
               return true
   return false

,基本情况为index = M,您可以在给定位掩码(以及隐式标签映射)的情况下检查边缘是否相等。或者,您也可以在if语句中进行检查 - 只需检查给定的当前index,当前子图G_1[0..index]等于G[bitmask](具有相同的隐式标签映射),然后再递归

对于N = 20,这应该足够快。

(添加你的备忘录,或者你可以使用自下而上的DP重写它。)

答案 1 :(得分:0)

好的,我不得不问一个显而易见的问题。 你有二十个顶点。首先深入浏览每个图形,按字母顺序排列     兄弟姐妹得到字符串。 2.一个图是另一个字符串在另一个字符串中的子图。

那么,问题规范中还有哪些内容可以使其不可行?

答案 2 :(得分:0)

您可以将其视为对齐问题。基本上你想要提出一个内射映射 a ,它将V_1中的每个顶点映射到V_2中的顶点。对齐映射 a 可按如下方式评分:

s(a)= \ sum _ {(v,w)\ in E_1} \ sigma(v,w,a(v),a(w)),

其中\ sigma(v,w,a(v),a(w))= 1,if(a(v),a(w))\在E_2中,否则为0。

我认为这可以用整数线性程序的形式表达。