private void ContoursSearch() { Contours.Clear(); int[] color = new int[Nodes.Count]; for (int i = 0; i < Nodes.Count; i++) // По каждой ноде { for (int k = 0; k < Nodes.Count; k++) // Сбрасываем цвет всех нод на 1 { color[k] = 1; } ElementsContour contour = new ElementsContour(); // Цикл contour.AddNode(Nodes[i]); // Добавляем начальную точку в цикл DFScycle(i, i, color, -1, contour); // Находим списки всех циклов с началом в текущей точке } }
private void DFScycle(int u, int endV, int[] color, int unavailableEdge, ElementsContour contour) { //если u == endV, то эту вершину перекрашивать не нужно, иначе мы в нее не вернемся, а вернуться необходимо if (u != endV) { color[u] = 2; // Закрашиваем посещенную вершину } else if (contour.Count >= 2) { if (isContourFree(contour)) // Проверяем, существует ли эта цепь { Contours.Add(contour); if (Contours.Count > 15) { throw new WrongSchemeException("Too difficult"); } return; } } for (int w = 0; w < Connectors.Count; w++) { if (w == unavailableEdge) { continue; } if (color[Connectors[w].NodeB.Number] == 1 && Connectors[w].NodeA.Number == u) { ElementsContour newContour = new ElementsContour(contour); newContour.AddNode(Connectors[w].NodeB); DFScycle(Connectors[w].NodeB.Number, endV, color, w, newContour); color[Connectors[w].NodeB.Number] = 1; } else if (color[Connectors[w].NodeA.Number] == 1 && Connectors[w].NodeB.Number == u) { ElementsContour newContour = new ElementsContour(contour); newContour.AddNode(Connectors[w].NodeA); DFScycle(Connectors[w].NodeA.Number, endV, color, w, newContour); color[Connectors[w].NodeA.Number] = 1; } } }