示例#1
0
 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);               // Находим списки всех циклов с началом в текущей точке
     }
 }
示例#2
0
 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;
         }
     }
 }