Today’s Erlang Thursday is on digraph:get_cycle/2.
We will continue working with the graph from the previous post on digraph:get_path/3.

Graph = digraph:new().
% {digraph,20498,24595,28692,true}
V1 = digraph:add_vertex(Graph).
% ['$v'|0]
V2 = digraph:add_vertex(Graph).
% ['$v'|1]
V3 = digraph:add_vertex(Graph).
% ['$v'|2]
V4 = digraph:add_vertex(Graph).
% ['$v'|3]
E1 = digraph:add_edge(Graph, V1, V2).
% ['$e'|0]
E2 = digraph:add_edge(Graph, V2, V3).
% ['$e'|1]
E3 = digraph:add_edge(Graph, V3, V4).
% ['$e'|2]
E4 = digraph:add_edge(Graph, V2, V4).
% ['$e'|3]
E5 = digraph:add_edge(Graph, V4, V1).
% ['$e'|4]
digraph:get_cycle/2 takes a graph G, and an vertex V, and tries to find a path that creates a cycle between the vertex V in graph G.
digraph:get_cycle(Graph, V1). % [['$v'|0],['$v'|1],['$v'|3],['$v'|0]] digraph:get_cycle(Graph, V2). % [['$v'|1],['$v'|3],['$v'|0],['$v'|1]]
Next, we add a new vertex V5, and a new edge originating from V4 and ending on V5
We then call digraph:get_cycle/2 on V5, and we get back a false as no cyle exists in the graph with vertex V5 in it.
V5 = digraph:add_vertex(Graph). % ['$v'|4] E6 = digraph:add_edge(Graph, V4, V5). % ['$e'|5] digraph:get_cycle(Graph, V5). % false
The digraph module also contains the function digraph:get_short_cycle/2.
digraph:get_short_cycle/2 attempts to find the shortest cycle in the graph G for vertex V.
The documentation for digraph:get_short_cycle/2 exact phrasing is:
Tries to find an as short as possible simple cycle through the vertex V of the digraph G.
So depending on how you read that, the shortest cycle might not be guaranteed to be returned, but simply a shorter cycle, which may depend on the overall size and complexity of the graph.
digraph:get_short_cycle(Graph, V1). % [['$v'|0],['$v'|1],['$v'|3],['$v'|0]] digraph:get_short_cycle(Graph, V5). % false
–Proctor