コード例 #1
0
        /// <summary>
        /// Проводить пошук в глибину і шукає збільшуючий потік
        /// </summary>
        /// <param name="g"></param>
        /// <returns></returns>
        private List <Title_Edge> getUpFlow()
        {
            List <Title_Edge>   result = new List <Title_Edge>();
            List <Title_Vertex> stack  = new List <Title_Vertex>();

            _m.startTitle();
            stack.Add(_s);
            //Цикл припиняється, якщо з розгляду виключається початкова точка
            while (stack.Count != 0)
            {
                Title_Vertex workV = stack[stack.Count - 1];
                workV.state = false;
                Title_Edge workE = _m.getNoMarkEdge(workV.index);
                if (workE == null)
                {
                    //ребро не знайдено. йдемо вверх по стеку
                    workV.state = true;
                    stack.RemoveAt(stack.Count - 1);
                    try {
                        result.RemoveAt(stack.Count - 1);
                    }
                    catch { }
                    continue;
                }

                Title_Vertex nextV = workE.v2;
                //перевіряємо, чи можна добавити точку в стек
                if (nextV.index == _t.index)
                {
                    //шлях знайдено
                    result.Add(workE);
                    break;
                }
                if (!nextV.state)
                {
                    //точка вже знаходиться в стеку
                    stack.RemoveAt(stack.Count - 1);
                    workV.state = true;
                    result.RemoveAt(result.Count - 1);
                }
                else
                {
                    //точку можна добавити в стек
                    stack.Add(nextV);
                    result.Add(workE);
                }
                //Позначаємо ребро як розглянуте
                workE.state = false;
            }
            return(result);
        }
コード例 #2
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] < 0)
                    {
                        result = _edges[e];
                        break;
                    }
                }
            }
            return(result);
        }
コード例 #3
0
        /// <summary>
        /// Шукає номера вершин в масиві, що з'єднані вказаним ребром
        /// </summary>
        /// <param name="_v"></param>
        /// <param name="e"></param>
        /// <returns></returns>
        private TwoNumber serachConectedVertises(Title_Vertex[] _v, Title_Edge e)
        {
            //Знаходимо вершини, які з'єднюються ребром
            TwoNumber number = new TwoNumber();

            for (int j = 0, t = 0; j < _v.Length; j++)
            {
                if (_v[j].vertex.CompareTo(e.edge.Source) == 0)
                {
                    number._n1 = j;
                    t++;
                }
                else if (_v[j].vertex.CompareTo(e.edge.Target) == 0)
                {
                    number._n2 = j;
                    t++;
                }
            }

            return(number);
        }