我正在寻找一种算法来检查给定的图是否是另一个给定图的子图。
我没有什么条件可以使这个NP完全问题更可行..
线图A - B是A - B - A的子图,但A - A不是A - B - A的子图。
任何建议都没问题。这不是一个功课问题顺便说一下。 :d
答案 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 :(得分: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。
我认为这可以用整数线性程序的形式表达。