// Задать граф private void buttonInitializeGraph_Click(object sender, EventArgs e) { bool[,] matrix; int demension; PointF[] layout; try { matrix = ReadGraph(out demension, out layout); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } visualizingGraph = new Graph(matrix, checkBoxDirectedGraph.Checked); // Задаём вершинам координаты if (layout != null) { for (var vertIndex = 0; vertIndex < demension; vertIndex++) { visualizingGraph.Vertices[vertIndex].DrawingCoords = new PointF { X = layout[vertIndex].X, Y = layout[vertIndex].Y } } } ; // Задаём вершинам метки foreach (var vertex in visualizingGraph.Vertices) { vertex.Label = "в"; } // Задаём рёбрам метки foreach (var edge in visualizingGraph.Edges) { edge.Label = "р"; } visualizer.Initialize(visualizingGraph); }
List <Tuple <int, int> > correctMinimalCut; // правильное множество дуг минимального разреза // ----Интерфейс задачи public void InitializeProblem(ProblemExample example, ProblemMode mode) { // Если требуется случайная генерация if (example == null) { // Если случайной генерации нет, говорим, что не реализовано if (!ProblemDescriptor.IsRandomExampleAvailable) { throw new NotImplementedException("Случайная генерация примеров не реализована"); } // Иначе - генерируем задание else { example = ExampleGenerator.GenerateExample(); } } // Если нам дан пример не задачи о максимальном потоке - ошибка maxFlowExample = example as MaxFlowProblemExample; if (maxFlowExample == null) { throw new ArgumentException("Ошибка в выбранном примере. Его невозможно открыть."); } // В зависимости от режима задачи (решение/демонстрация) меняем некоторые элементы управления problemMode = mode; if (problemMode == ProblemMode.Solution) { SetAnswerGroupBoxSolutionMode(); } else if (problemMode == ProblemMode.Demonstration) { SetAnswerGroupBoxDemonstrationMode(); } // Создаём граф для визуализации по примеру visGraph = new Graph(maxFlowExample.GraphMatrix, maxFlowExample.IsGraphDirected); // Если у нас есть укладка по умолчанию - визуализируем граф в SimpleGraphVisualizer if (example.DefaultGraphLayout != null) { // Задаём расположение вершин графа for (int i = 0; i < visGraph.VerticesCount; i++) { visGraph.Vertices[i].DrawingCoords = maxFlowExample.DefaultGraphLayout[i]; } SetVisualizer(true); } // Если укладки по умолчанию нет (граф случайно сгенерирован) - визуализируем в MSAGL else { SetVisualizer(false); } graphVisInterface.Initialize(visGraph); // Сохраняем матрицу графа, исток и сток для решения. Создаём нужные коллекции capacityMatrix = (int[, ])maxFlowExample.CapacityMatrix.Clone(); verticesCount = maxFlowExample.GraphMatrix.GetLength(0); sourceVertexIndex = maxFlowExample.SourceVertexIndex; targetVertexIndex = maxFlowExample.TargetVertexIndex; flowMatrix = new int[verticesCount, verticesCount]; curAugmentalPath = new List <int>(); curCutEdges = new List <Tuple <int, int> >(); selectedAugmentalPath = null; selectedPathVertexIndex = 0; minimalCutEdgeIndex = 0; // Пишем условие задачи - номер истока и номер стока textLabelExampleDescription.Text = $"Исток: {maxFlowExample.SourceVertexIndex + 1}; Сток: {maxFlowExample.TargetVertexIndex + 1}"; // Выделяем исток и сток жирным visGraph.Vertices[maxFlowExample.SourceVertexIndex].Bold = true; visGraph.Vertices[maxFlowExample.TargetVertexIndex].Bold = true; // Отображаем метки величины потока на дугах UpdateEdgesLabels(); // Получаем решение задачи Algorithm.GetMaxFlowSolve(capacityMatrix, sourceVertexIndex, targetVertexIndex, out correctMinimalCut, out correctMaxFlowValue); // Инициализируем статистику решения if (problemMode == ProblemMode.Solution) { maxFlowProblemStatistics = new MaxFlowProblemStatistics(); } // Ставим решение в состояние ожидания начала SetStartWaitingState(); }
private int correctMaximalMatchingCardinality; // правильная мощность максимального паросочетания в данном графе (количество рёбер в нём) // ----Интерфейс задач public void InitializeProblem(ProblemExample example, ProblemMode mode) { // Если требуется случайная генерация if (example == null) { // Если случайной генерации нет, говорим, что не реализовано if (!ProblemDescriptor.IsRandomExampleAvailable) { throw new NotImplementedException("Случайная генерация примеров не реализована"); } // Иначе - генерируем задание else { example = ExampleGenerator.GenerateExample(); } } // Если нам дан пример не задачи о максимальном паросочетании в двудольном графе - ошибка maxBipartiteMatchingExample = example as MaxBipartiteMatchingProblemExample; if (maxBipartiteMatchingExample == null) { throw new ArgumentException("Ошибка в выбранном примере. Его невозможно открыть."); } // В зависимости от режима задачи (решение/демонстрация) меняем некоторые элементы управления problemMode = mode; if (problemMode == ProblemMode.Solution) { SetAnswerGroupBoxSolutionMode(); } else if (problemMode == ProblemMode.Demonstration) { SetAnswerGroupBoxDemonstrationMode(); } // Создаём граф для визуализации по примеру visGraph = new Graph(maxBipartiteMatchingExample.GraphMatrix, maxBipartiteMatchingExample.IsGraphDirected); // Задаём расположение вершин графа for (int i = 0; i < visGraph.VerticesCount; i++) { visGraph.Vertices[i].DrawingCoords = maxBipartiteMatchingExample.DefaultGraphLayout[i]; } graphVisInterface.Initialize(visGraph); // Сохраняем матрицу графа для решения. Создаём нужные коллекции graph = (bool[, ])maxBipartiteMatchingExample.GraphMatrix.Clone(); verticesCount = maxBipartiteMatchingExample.GraphMatrix.GetLength(0); curAugmentalPath = new List <int>(); matchingPairsArray = new int[verticesCount]; for (int i = 0; i < verticesCount; i++) { matchingPairsArray[i] = -1; } // Пишем условие задачи - номер истока и номер стока textLabelExampleDescription.Text = "Максимальное паросочетание?"; // Получаем решение задачи correctMaximalMatchingCardinality = Algorithm.GetMatchingCardinality(Algorithm.GetMaximalMatching(graph, verticesCount)); // Инициализируем статистику решения if (problemMode == ProblemMode.Solution) { maxBipartiteMatchingProblemStatistics = new MaxBipartiteMatchingProblemStatistics(); } // Ставим решение в состояние ожидания начала SetStartWaitingState(); }