public IEnumerable <Cycle> GetCycles(bool simplifyToSmallest = false) { if (Vertices.Count < 3) { return(new List <Cycle>()); } var result = new List <Cycle>(); var used = new List <Vertex>(); var parent = new Dictionary <Vertex, Vertex>(); var todo = new Stack <Vertex>(); todo.Push(Vertices[0]); parent.Add(Vertices[0], Vertices[0]); while (todo.Count > 0) { var cur = todo.Pop(); used.Add(cur); foreach (var neighbour in cur.Edges.Select(edge => edge.GetOtherVertex(cur)) .Where(neighbour => parent[cur] != neighbour)) { if (used.Contains(neighbour)) { var cycle = new Cycle(this, parent[cur]); cycle.AddEdge(parent[cur].GetEdgeTo(cur)); cycle.AddEdge(cur.GetEdgeTo(neighbour)); var v = neighbour; while (v != parent[cur]) { var e = v.GetEdgeTo(parent[v]); cycle.AddEdge(e); v = parent[v]; } result.Add(cycle); } else if (!parent.ContainsKey(neighbour)) { parent.Add(neighbour, cur); todo.Push(neighbour); } } } if (simplifyToSmallest && result.Count > 0) { return(SmallestBase(result)); } return(result); }