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