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