/// <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); }
/// <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); }
/// <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); }