Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1.         /// <summary>
  2.         /// Немного измененная функция алгоритма Дейкстры.
  3.         /// </summary>
  4.         /// <param name="adjacencyMatrix">матрица смежности</param>
  5.         /// <param name="matrixSize">размер матрицы</param>
  6.         /// <param name="srcVertex">стартовая вершина</param>
  7.         /// <param name="destVertex">конечная вершина</param>
  8.         /// <param name="visited">булевый массив посещенности вершин</param>
  9.         /// <param name="visitedCount">количество посещенных вершин</param>
  10.         /// <param name="neededVertexes">посещенные ребра</param>
  11.         private void Dijkstra(int[,] adjacencyMatrix, int matrixSize, int srcVertex, int destVertex, bool[] visited, int visitedCount, ref int neededVertexes)
  12.         {
  13.             for (int i = 0; i < matrixSize; i++)
  14.             {
  15.                 if (adjacencyMatrix[srcVertex, i] != 0 && !visited[i])
  16.                 {
  17.                     if (i == destVertex && neededVertexes < visitedCount + 1)
  18.                         neededVertexes = visitedCount + 1;
  19.                     else
  20.                     {
  21.                         visited[i] = true;
  22.                         Dijkstra(adjacencyMatrix, matrixSize, i, destVertex, visited, visitedCount + adjacencyMatrix[srcVertex, i], ref neededVertexes);
  23.                         visited[i] = false;
  24.                     }
  25.                 }
  26.             }
  27.         }
  28.  
  29.         /// <summary>
  30.         /// Возвращает минимальное количество дуг, с которыми орграф остается сильно связным.
  31.         /// </summary>
  32.         /// <param name="matrix">матрица смежности</param>
  33.         /// <returns>минимальное количество дуг, с которыми орграф остается сильно связным</returns>
  34.         private int GetNeededEdges(int[,] matrix)
  35.         {
  36.             int matrixSize = matrix.GetLength(0);
  37.             int[] counts = new int[matrixSize];
  38.             bool[] visited = new bool[matrixSize];
  39.             visited[0] = true;
  40.             for (int i = 0; i < matrixSize; i++)
  41.                 for (int j = 0; j < matrixSize; j++)
  42.                         Dijkstra(matrix, matrixSize, i, j, visited, 0, ref counts[i]);
  43.             return counts.Max() + 1;
  44.         }
  45.  
  46.         /// <summary>
  47.         /// Возвращает количество дуг для данной матрицы смежности, не учитывая петли.
  48.         /// </summary>
  49.         /// <param name="matrix">матрица смежности</param>
  50.         /// <returns>количество дуг</returns>
  51.         private int GetEdgeCount(int[,] matrix)
  52.         {
  53.             int edgeCount = 0;
  54.             for (int i = 0; i < matrix.GetLength(0); i++)
  55.                 for (int j = 0; j < matrix.GetLength(1); j++)
  56.                     if (matrix[i, j] == 1 && i != j)
  57.                         edgeCount++;
  58.             return edgeCount;
  59.         }