예제 #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
 public Flow(Graph g)
 {
     _m = new IncidenceMatrix(g);
     foreach (Title_Vertex v in _m._vertices)
     {
         if (v.vertex.Name == "S")
         {
             _s = v;
         }
         if (v.vertex.Name == "T")
         {
             _t = v;
         }
     }
 }
예제 #3
0
        public void shiftVertices(int istart)
        {
            Title_Vertex v = _vertices[istart];

            for (int i = istart; i < _vertices.Count - 1; i++)
            {
                if (_vertices[i].weigth == v.weigth)
                {
                    _vertices[i]     = _vertices[i + 1];
                    _vertices[i + 1] = v;
                }
                else
                {
                    break;
                }
            }
            generateMatrix();
        }