Exemple #1
0
        private Cycles iteration(Title_Vertex startPoint)
        {
            Cycles result = getCycle(startPoint);

            //виключаємо з розгляду знайдений цикл
            for (int e = 0; e < result.edgesCycle.Count; e++)
            {
                result.edgesCycle[e].inCircle = true;
            }
            //шукаємо інші цикли
            for (int v = 0; v < result.vertexCycle.Count; v++)
            {
                Cycles newCycle = iteration(result.vertexCycle[v]);
                result.edgesCycle.InsertRange(v, newCycle.edgesCycle);
                result.vertexCycle.InsertRange(v, newCycle.vertexCycle);
            }
            return(result);
        }
Exemple #2
0
        /// <summary>
        /// Шукає один цикл в графі
        /// </summary>
        /// <param name="startPoint"></param>
        private Cycles getCycle(Title_Vertex startPoint)
        {
            //позначаємо всі вершини як неопрацьовані
            for (int v = 0; v < _m._vertices.Count; v++)
            {
                _m._vertices[v].state = false;
            }
            //позначаємо ребра, що не ввійшли в цикл як неопрацьовані
            for (int e = 0; e < _m._edges.Count; e++)
            {
                if (!_m._edges[e].inCircle)
                {
                    _m._edges[e].state = false;
                }
            }

            //стек
            List <Title_Edge>   result = new List <Title_Edge>();
            List <Title_Vertex> stack  = new List <Title_Vertex>();

            stack.Add(startPoint);

            //використовуємо пошук вглибину для знаходження циклу
            while (stack.Count != 0)
            {
                Title_Vertex workV = stack[stack.Count - 1];
                workV.state = true;
                Title_Edge workE = _m.getNoMarkEdge(workV.index);
                if (workE == null)
                {
                    stack.RemoveAt(stack.Count - 1);
                    continue;
                }
                workE.state = true;

                Title_Vertex nextV;
                if (workE.v1.index == workV.index)
                {
                    nextV = workE.v2;
                }
                else
                {
                    nextV = workE.v1;
                }

                //перевіряємо, чи можна добавити точку в стек
                if (nextV.index == startPoint.index)
                {
                    //цикл знайдено
                    result.Add(workE);
                    break;
                }
                if (nextV.state)
                {
                    //точка вже знаходиться в стеку
                    stack.RemoveAt(stack.Count - 1);
                    result.RemoveAt(result.Count - 1);
                }
                else
                {
                    //точку можна добавити в стек
                    stack.Add(nextV);
                    result.Add(workE);
                }
            }

            //Отриманий стек порожній, якщо цикл не знайдено
            Cycles cycles;

            cycles.edgesCycle  = result;
            cycles.vertexCycle = stack;
            return(cycles);
        }