我有一个由强连通分量(蓝色)和一组节点(橙色)组成的有向图,它们是它的输入。挑战在于用最少的边缘去除尽可能多的循环。此外,每个橙色节点到每个蓝色节点都必须有一条路径。
我用蛮力解决了这个问题:
代码的核心如下所示:
for level in range(2, len(edges)):
stop = True
edges2 = combinations(edges,level)
for i, e in enumerate(edges2):
g.remove_edges_from(e)
test = True
for node in orange_nodes:
d = nx.algorithms.descendants(g, node)
test = blue_nodes == d
if not test:
break
if test:
stop = False
cycles_count = len(list(nx.simple_cycles(g)))
print(f'{i}\t{level}\t{cycles_count}\t{e}')
g.add_edges_from(e)
if stop:
break
Run Code Online (Sandbox Code Playgroud)
问题: