Пример #1
0
        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);
        }