Is it possible to (quickly) find only the first cycle in a networkx graph?

Viewed 387

I have a directed network that may or may not have cycles in it. I need to find them and remove the cyclicity. If I have a networkx DiGraph (G), I can find all the cycles with

cycle_nodes = nx.simple_cycles(G)

which creates a cycle-returning generator.

However, I don't want to return all cycles a la list(cycle_nodes) because many of the cycles are subsets of each other, and fixing one will fix others. Instead, I would like to only find the first instance of a cycle. As cycle_nodes is a generator, I tried

next(cycle_nodes)

to return only the first instance. However, I found that the time required to return the first instance not much smaller compared to the time required to return all instances:

list(cycle_nodes) : 58s
next(cycle_nodes) : 44s

Is this just due to the nature of my graph (i.e. the first cycle is far along the search order), or is there a more efficient way to return any cycle (doesn't necessarily need to be the first)?

The reason I suspect there may be a faster way is because when I run nx.is_directed_acyclic_graph(G), it takes only a second or two and returns False, so it's obviously finding at least one cycle in just a second or so.

1 Answers

The answer was sort of obvious. The algorithm nx.find_cycle() with no starting node provided will return the first cycle it finds, and rapidly. I was under the impression that a starting node needed to be provided, RTFM!

Related