Exemple #1
0
        /// <summary>
        /// Повертає не список опрацьованих ребер.
        /// </summary>
        /// <param name="indexV"></param>
        /// <returns></returns>
        public Title_Edge getNoMarkEdge(int indexV)
        {
            Title_Edge result = null;

            for (int e = 0; e < _edges.Count; e++)
            {
                //якщо ребро не опрацьоване
                if (!_edges[e].state)
                {
                    if (_m[indexV, e] != unmarks)
                    {
                        result = _edges[e];
                        break;
                    }
                }
            }
            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);
        }