假设我有一个大的(几千个节点)有向图 G 和一个小得多的(3-5节点)有向图 g 。我想计算 g 中 g 的多少同构数。换句话说,我想知道 G 中有多少个唯一的节点集匹配 g 。我意识到这是子图同构问题的一个实例,因此是NP完全的。但是,鉴于你可能认为 g 很小,有没有合理有效的算法呢?
答案 0 :(得分:1)
虽然图形同构一般是NP完全的,但是在现实世界中遇到的问题通常很容易。一个简单的蛮力就足够了:让M_i
成为从g的第一个i节点到G节点的一组映射。从包含空映射的m_0
开始,一次扩展一个节点,丢弃任何违反约束x->y
iff m(x)->m(y)
的地图。
您需要在g中对节点进行排序,以便尽早进行大量修剪。假设你的图表非常稀疏,你需要一个尽可能早地完成边数的订单,也许是来自最高度节点的dfs。