我正在编写一个函数is_iso(graph1, graph2)
,它接受两个图形作为输入,然后确定这两个图形是否是同构的。
我可以假设两个图形具有相同数量的顶点,并且顶点上使用的名称将是相同的。
is_iso({“A” : [“B”, “C”], “B” : [“A”], “C” : [“A”]}, {“A” : [“B”], “B” : [“A”, “C”], “C” : [“B”]})
应该返回True
is_iso({“A” : [“B”, “C”], “B” : [“A”, “C”], “C” : [“A”, “B”]}, {“A” : [“B”, “C”], “B” : [“A”], “C” :[“A”]})
应该返回False
def is_iso(graph1,graph2):
for vertex in graph1:#loops through every vertex in graph1
seq1 += [len(graph1[vertex])]#adds the degree of each vertex to the list
for vertex in graph2: #loops through every vertex in graph2
seq2 += [len(graph2[vertex])]#adds the degree of each vertex to the list
return sorted(seq1) == sorted(seq2)
我的所有方法目前都检查度数序列是否相同,但是图形可以具有相同的度序列而不是同构的。我不知道如何从这里完成检查。我不允许导入任何库。非常感谢任何帮助!
答案 0 :(得分:0)
最简单的可能实现就是强制它。我们需要在其中一个图表中尝试所有可能的起点:
for each neighbour i in G1[v1]
for each neighbour j in G2[v2]
match(i, j)
但第二行是什么意思?!好吧,比如:
private static final Logger logger = Logger.getLogger(BusController.class.getName());
请注意,我们还必须跟踪目前已匹配的节点,并在找到匹配后立即返回。
我们可以通过使用度序列来改善问题 - 显然每个图中相同度数的顶点必须匹配,所以只考虑这些作为匹配的候选者。
当然,还有更复杂的算法,但只有你需要速度或有大图时才真正重要。作为参考,请考虑VF2算法: