Обход графа в ширину - перевести код с C++ - C#

Узнай цену своей работы

Формулировка задачи:

Добрый вечер. Умоляю, помогите перевести нижепредставленный код в C#, какой день уже мучаюсь, все не получается, но надо. Буду очень признателен! Код:
Листинг программы
  1. const int MAX_VERTICES = 40;
  2. int NUM_VERTICES; // число вершин в графе
  3. const int INFINITY = 10000; // условное число обозначающее бесконечность
  4. // f - массив, содержащий текущее значение потока
  5. // f[i][j] - поток, текущий от вершины i к j
  6. int f[MAX_VERTICES][MAX_VERTICES];
  7. // с - массив содержащий вместимости ребер,
  8. // т.е. c[i][j] - максимальная величину потока способная течь по ребру (i,j)
  9. int c[MAX_VERTICES][MAX_VERTICES];
  10. // набор вспомогательных переменных используемых функцией FindPath - обхода в ширину
  11. // Flow - значение потока через данную вершину на данном шаге поиска
  12. int Flow[MAX_VERTICES];
  13. // Link используется для нахождения собственно пути
  14. // Link[i] хранит номер предыдущей вершины на пути i -> исток
  15. int Link[MAX_VERTICES];
  16. int Queue[MAX_VERTICES]; // очередь
  17. int QP, QC; // QP - указатель начала очереди и QC - число эл-тов в очереди
  18. // поиск пути, по которому возможно пустить поток алгоритмом обхода графа в ширину
  19. // функция ищет путь из истока в сток, по которому еще можно пустить поток,
  20. // считая вместимость ребра (i,j) равной c[i][j] - f[i][j],
  21. // т.е. после каждой итерации (одна итерация - один поиск пути) уменьшаем вместимости ребер,
  22. // на величину пущеного потока
  23. int FindPath(int source, int target) // source - исток, target - сток
  24. {
  25. QP = 0; QC = 1; Queue[0] = source;
  26. Link[target] = -1; // особая метка для стока
  27. int i;
  28. int CurVertex;
  29. memset(Flow, 0, sizeof(int)*NUM_VERTICES); // в начале из всех вершин кроме истока течет 0
  30. Flow[source] = INFINITY; // а из истока может вытечь сколько угодно
  31. while (Link[target] == -1 && QP < QC)
  32. {
  33. // смотрим, какие вершины могут быть достигнуты из начала очереди
  34. CurVertex = Queue[QP];
  35. for (i=0; i<NUM_VERTICES; i++)
  36. // проверяем, можем ли мы пустить поток по ребру (CurVertex,i):
  37. if ((c[CurVertex][i] - f[CurVertex][i])>0 && Flow[i] == 0)
  38. {
  39. // если можем, то добавляем i в конец очереди
  40. Queue[QC] = i; QC++;
  41. Link[i] = CurVertex; // указываем, что в i добрались из CurVertex
  42. // и находим значение потока текущее через вершину i
  43. if (c[CurVertex][i]-f[CurVertex][i] < Flow[CurVertex])
  44. Flow[i] = c[CurVertex][i];
  45. else
  46. Flow[i] = Flow[CurVertex];
  47. }
  48. QP++;// прерходим к следующей в очереди вершине
  49. }
  50. // закончив поиск пути
  51. if (Link[target] == -1) return 0; // мы или не находим путь и выходим
  52. // или находим:
  53. // тогда Flow[target] будет равен потоку, который "дотек" по данному пути из истока в сток
  54. // тогда изменяем значения массива f для данного пути на величину Flow[target]
  55. CurVertex = target;
  56. while (CurVertex != source) // путь из стока в исток мы восстанавливаем с помощью массива Link
  57. {
  58. f[Link[CurVertex]][CurVertex] +=Flow[target];
  59. CurVertex = Link[CurVertex];
  60. }
  61. return Flow[target]; // Возвращаем значение потока которое мы еще смогли "пустить" по графу
  62. }
  63. // основная функция поиска максимального потока
  64. int MaxFlow(int source, int target) // source - исток, target - сток
  65. {
  66. // инициализируем переменные:
  67. memset(f, 0, sizeof(int)*MAX_VERTICES*MAX_VERTICES); // по графу ничего не течет
  68. int MaxFlow = 0; // начальное значение потока
  69. int AddFlow;
  70. do
  71. {
  72. // каждую итерацию ищем какй-либо простой путь из истока в сток
  73. // и какой еще поток мажет быть пущен по этому пути
  74. AddFlow = FindPath(source, target);
  75. MaxFlow += AddFlow;
  76. } while (AddFlow >0);// повторяем цикл пока поток увеличивается
  77. return MaxFlow;
  78. }
  79. int main()
  80. {
  81. printf(rus("\n НАХОЖДЕНИЕ МАКСИМАЛЬНОГО ПОТОКА \n"));
  82. printf(rus("\n АЛГОРИТМ ФОРДА-ФАЛКЕРСОНА \n\n"));
  83. printf(rus("\n КУРСОВАЯ РАБОТА ПО ДИСКРЕТНОЙ МАТЕМАТИКЕ \n"));
  84. printf(rus("\n выполнили: Шаяхметов А.Р. , Корпухин М.В. \n\n"));
  85. printf(rus("\n ПО-122 ФИРТ УГАТУ 2007г\n\n"));
  86. printf(rus("\n\n нажмите любую клавишу для продолжения...."));
  87. getch();
  88. clrscr();
  89. int source, target;
  90. printf(rus("\n Введите число вершин в графе\n-->"));
  91. scanf("%d", &NUM_VERTICES);
  92. printf(rus("\n Введите значения истока и стока \n-->"));
  93. scanf("%d %d", &source, &target);
  94. printf(rus("\n Введите матрицу содержащею вместимость ребер: \n "));
  95. printf(rus("каждый элемент - вместимость ребра ведушего \n из вершины с номером его строки к вершине с номером его столбца\n"));
  96. int i, j;
  97. for (i=0; i<NUM_VERTICES; i++)
  98. for (j=0; j<NUM_VERTICES; j++)
  99. scanf("%d",&c[i][j]);
  100. printf(rus("\n максимальный поток равен:"));
  101. printf("%d", MaxFlow(source, target));
  102. getch();
  103. return 0;
  104. }

Решение задачи: «Обход графа в ширину - перевести код с C++»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace ConsoleApplication1
  7. {
  8.  
  9.     class Program
  10.     {
  11.          const int MAX_VERTICES = 40;
  12.         static int NUM_VERTICES; // число вершин в графе
  13.         const int INFINITY = 10000; // условное число обозначающее бесконечность
  14.         // f - массив, содержащий текущее значение потока
  15.         // f[i][j] - поток, текущий от вершины i к j
  16.         static int[,] f = new int[MAX_VERTICES, MAX_VERTICES];
  17.         // с - массив содержащий вместимости ребер,
  18.         // т.е. c[i][j] - максимальная величину потока способная течь по ребру (i,j)
  19.         static int[,] c = new int[MAX_VERTICES, MAX_VERTICES];
  20.  
  21.         // набор вспомогательных переменных используемых функцией FindPath - обхода в ширину
  22.         // Flow - значение потока через данную вершину на данном шаге поиска
  23.         static int[] Flow = new int[MAX_VERTICES];
  24.         // Link используется для нахождения собственно пути
  25.         // Link[i] хранит номер предыдущей вершины на пути i -> исток
  26.         static int[] Link = new int[MAX_VERTICES];
  27.         static int[] Queue = new int[MAX_VERTICES]; // очередь
  28.         static int QP, QC; // QP - указатель начала очереди и QC - число эл-тов в очереди
  29.  
  30.         // поиск пути, по которому возможно пустить поток алгоритмом обхода графа в ширину
  31.         // функция ищет путь из истока в сток, по которому еще можно пустить поток,
  32.         // считая вместимость ребра (i,j) равной c[i][j] - f[i][j],
  33.         // т.е. после каждой итерации (одна итерация - один поиск пути) уменьшаем вместимости ребер,
  34.         // на величину пущеного потока
  35.         static int FindPath(int source, int target) // source - исток, target - сток
  36.         {
  37.             QP = 0; QC = 1; Queue[0] = source;
  38.             Link[target] = -1; // особая метка для стока
  39.             int i;
  40.             int CurVertex;
  41.  
  42.             Flow[source] = INFINITY; // а из истока может вытечь сколько угодно
  43.             while (Link[target] == -1 && QP < QC)
  44.             {
  45.                 // смотрим, какие вершины могут быть достигнуты из начала очереди
  46.                 CurVertex = Queue[QP];
  47.                 for (i = 0; i < NUM_VERTICES; i++)
  48.                     // проверяем, можем ли мы пустить поток по ребру (CurVertex,i):
  49.                     if ((c[CurVertex, i] - f[CurVertex, i]) > 0 && Flow[i] == 0)
  50.                     {
  51.                         // если можем, то добавляем i в конец очереди
  52.                         Queue[QC] = i; QC++;
  53.                         Link[i] = CurVertex; // указываем, что в i добрались из CurVertex
  54.                         // и находим значение потока текущее через вершину i
  55.                         if (c[CurVertex, i] - f[CurVertex, i] < Flow[CurVertex])
  56.                             Flow[i] = c[CurVertex, i];
  57.                         else
  58.                             Flow[i] = Flow[CurVertex];
  59.                     }
  60.                 QP++;// прерходим к следующей в очереди вершине
  61.             }
  62.             // закончив поиск пути
  63.             if (Link[target] == -1) return 0; // мы или не находим путь и выходим
  64.             // или находим:
  65.             // тогда Flow[target] будет равен потоку, который "дотек" по данному пути из истока в сток
  66.             // тогда изменяем значения массива f для  данного пути на величину Flow[target]
  67.             CurVertex = target;
  68.             while (CurVertex != source) // путь из стока в исток мы восстанавливаем с помощью массива Link
  69.             {
  70.                 f[Link[CurVertex],CurVertex] += Flow[target];
  71.                 CurVertex = Link[CurVertex];
  72.             }
  73.             return Flow[target]; // Возвращаем значение потока которое мы еще смогли "пустить" по графу
  74.         }
  75.  
  76.         // основная функция поиска максимального потока
  77.         static int MaxFlow(int source, int target) // source - исток, target - сток
  78.         {
  79.             // инициализируем переменные:
  80.  
  81.             int MaxFlow = 0; // начальное значение потока
  82.             int AddFlow;
  83.             do
  84.             {
  85.                 // каждую итерацию ищем какй-либо простой путь из истока в сток
  86.                 // и какой еще поток мажет быть пущен по этому пути
  87.                 AddFlow = FindPath(source, target);
  88.                 MaxFlow += AddFlow;
  89.             } while (AddFlow > 0);// повторяем цикл пока поток увеличивается
  90.             return MaxFlow;
  91.         }
  92.  
  93.         static void Main(string[] args)
  94.         {
  95.             Console.WriteLine("\n              НАХОЖДЕНИЕ МАКСИМАЛЬНОГО ПОТОКА     \n");
  96.             Console.WriteLine("\n                 АЛГОРИТМ ФОРДА-ФАЛКЕРСОНА  \n\n");
  97.             Console.WriteLine("\n          КУРСОВАЯ РАБОТА ПО ДИСКРЕТНОЙ МАТЕМАТИКЕ \n");
  98.             Console.WriteLine("\n           выполнили: Шаяхметов А.Р. , Корпухин М.В. \n\n");
  99.             Console.WriteLine("\n                 ПО-122 ФИРТ УГАТУ      2007г\n\n");
  100.             Console.WriteLine("\n\n     нажмите любую клавишу для продолжения....");
  101.  
  102.  
  103.  
  104.             Console.WriteLine("\n Введите число вершин в графе\n-->");
  105.             NUM_VERTICES = Convert.ToInt16(Console.ReadLine());
  106.             Console.WriteLine("\n Введите значения истока и стока \n-->");
  107.             int source = Convert.ToInt16(Console.ReadLine());
  108.             int target = Convert.ToInt16(Console.ReadLine());
  109.             Console.WriteLine("\n   Введите матрицу содержащею вместимость ребер: \n ");
  110.             Console.WriteLine("каждый элемент - вместимость ребра ведушего \n из вершины с номером его строки к вершине с номером его столбца\n");
  111.  
  112.             for (int i = 0; i < NUM_VERTICES; i++)
  113.                 for (int j = 0; j < NUM_VERTICES; j++)
  114.                     c[i, j] = Convert.ToInt16(Console.ReadLine());
  115.  
  116.             Console.WriteLine("\n максимальный поток равен:");
  117.             Console.WriteLine(MaxFlow(source, target));
  118.             Console.ReadLine();
  119.         }
  120.  
  121.  
  122.     }
  123. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут