// Перевести задачу в состояние ожидания величины максимального потока для построеннного максимального потока сети void SetMaximalFlowWaiting() { problemState = MaxFlowProblemState.MaximalFlowWaiting; if (problemMode == ProblemMode.Solution) { graphVisInterface.InteractiveMode = InteractiveMode.NonInteractive; graphVisInterface.IsVerticesMoving = false; } string message = ""; if (problemMode == ProblemMode.Solution) { message = "Максимальный поток в сети построен." + Environment.NewLine + "Введите в поле для ответов величину построенного максимального потока в виде одного целого числа."; } else if (problemMode == ProblemMode.Demonstration) { message = "Максимальный поток в сети построен." + Environment.NewLine + $"Величина максимального (текущего) потока для данной сети равна {correctMaxFlowValue}."; } ShowSuccessTip(message); if (problemMode == ProblemMode.Solution) { UnlockAnswerGroupBox(); } buttonReloadIteration.Enabled = false; }
// Перевести задачу в состояние ожидания величины аугментального потока для построенного аугментального пути void SetFlowRaiseWaiting() { problemState = MaxFlowProblemState.FlowRaiseWaiting; if (problemMode == ProblemMode.Solution) { graphVisInterface.InteractiveMode = InteractiveMode.NonInteractive; graphVisInterface.IsVerticesMoving = false; } string message = ""; if (problemMode == ProblemMode.Solution) { message = "Аугментальный путь построен." + Environment.NewLine + "Введите в поле для ответов величину дополнительного потока, который можно пустить по построенному аугментальному пути, в виде одного целого числа."; } else if (problemMode == ProblemMode.Demonstration) { message = "Аугментальный путь построен." + Environment.NewLine + $"Нажмите кнопку \"Сделать шаг\", чтобы пустить по построенному аугментальному пути дополнительный поток величиной {curAugmentalFlowValue}."; } ShowSuccessTip(message); if (problemMode == ProblemMode.Solution) { UnlockAnswerGroupBox(); } buttonReloadIteration.Enabled = false; }
// Перевести задачу в состояние ожидания метки выбранной вершины для аугментального пути void SetPathVertexLabelWaiting() { problemState = MaxFlowProblemState.PathVertexLabelWaiting; if (problemMode == ProblemMode.Solution) { graphVisInterface.InteractiveMode = InteractiveMode.NonInteractive; graphVisInterface.IsVerticesMoving = false; } string message = ""; if (problemMode == ProblemMode.Solution) { message = "Введите метку для вершины в поле для ответов, а затем нажмите кнопку \"Принять ответ\"." + Environment.NewLine + "Метка вводится в формате:" + Environment.NewLine + "\"<знак><предыдущая вершина> <текущий аугментальный поток>\"," + Environment.NewLine + "например: \"+1 inf\" или \"-7 19\"." + Environment.NewLine + "Для вершины-истока текущий аугментальный поток следует принять бесконечным: \"inf\"." + Environment.NewLine + "Метка проверяется на правильность, и ошибочная метка будет отмечена как ошибка (кроме опечаток)." + Environment.NewLine + "Вы можете не ставить метку: для этого оставьте поле ввода ответа пустым."; } ShowStandardTip(message); if (problemMode == ProblemMode.Solution) { UnlockAnswerGroupBox(); } buttonReloadIteration.Enabled = true; }
// Перевести задачу в состояние ожидания следующей вершины для аугментального пути void SetNextPathVertexWaiting() { problemState = MaxFlowProblemState.NextPathVertexWaiting; if (problemMode == ProblemMode.Solution) { graphVisInterface.InteractiveMode = InteractiveMode.Interactive; graphVisInterface.IsVerticesMoving = true; } string message = ""; if (problemMode == ProblemMode.Solution) { message = "Выберите следующую вершину для аугментального пути." + Environment.NewLine; } else if (problemMode == ProblemMode.Demonstration) { if (curAugmentalPath.Count > 0) { int lastVertexIndex = curAugmentalPath.Last(); message = $"Последней выбрана вершина {lastVertexIndex + 1}, метка для неё: {visGraph[lastVertexIndex].Label}." + Environment.NewLine; } } if (curAugmentalPath.Count > 0) { // Формируем строку с текущим аугментальным маршрутом StringBuilder pathStr = new StringBuilder(); foreach (var pathVertex in curAugmentalPath) { pathStr.Append($"{pathVertex + 1}-"); } // Удаляем последнюю чёрточку pathStr.Remove(pathStr.Length - 1, 1); message += $"Текущий аугментальный путь: {pathStr}." + Environment.NewLine; } if (problemMode == ProblemMode.Demonstration) { message += "Нажмите кнопку \"Сделать шаг\", чтобы добавить следующую вершину в строящийся аугментальный путь."; } ShowStandardTip(message); if (problemMode == ProblemMode.Solution) { LockAnswerGroupBox(); } buttonReloadIteration.Enabled = true; }
// Перевести задачу в состояние выполненной задачи void SetProblemFinish() { problemState = MaxFlowProblemState.ProblemFinish; if (problemMode == ProblemMode.Solution) { graphVisInterface.InteractiveMode = InteractiveMode.NonInteractive; graphVisInterface.IsVerticesMoving = false; } string message = "Максимальный поток и минимальный разрез в сети найдены." + Environment.NewLine + "Задание успешно выполнено!"; ShowSuccessTip(message); LockAnswerGroupBox(); buttonReloadIteration.Enabled = false; // Отмечаем, что задача решена if (problemMode == ProblemMode.Solution) { ProblemStatistics.IsSolved = true; Close(); } }
// Перевести задачу в состояние ожидания следующей дуги минимального разреза void SetNextCutEdgeWaiting() { problemState = MaxFlowProblemState.NextCutEdgeWaiting; if (problemMode == ProblemMode.Solution) { graphVisInterface.InteractiveMode = InteractiveMode.Interactive; graphVisInterface.IsVerticesMoving = true; } string message = ""; if (problemMode == ProblemMode.Solution) { message = "Выберите все дуги, которые входят в минимальный разрез данной сети." + Environment.NewLine; } if (curCutEdges.Count != 0) { // Формируем строку с текущими выбранными дугами разреза StringBuilder cutEdgesStr = new StringBuilder(); foreach (var cutEdge in curCutEdges) { cutEdgesStr.Append($"({cutEdge.Item1 + 1};{cutEdge.Item2 + 1}), "); } // Удаляем последнюю запятую и пробел cutEdgesStr.Remove(cutEdgesStr.Length - 2, 2); message += $"Уже отмеченные дуги минимального разреза: {cutEdgesStr}." + Environment.NewLine; } if (problemMode == ProblemMode.Demonstration) { message = "Нажмите кнопку \"Сделать шаг\", чтобы выбрать очередную дугу минимального разреза."; } ShowStandardTip(message); if (problemMode == ProblemMode.Solution) { LockAnswerGroupBox(); } buttonReloadIteration.Enabled = false; }
// ----Методы изменения состояния (этапа) решения задания // Перевести задачу в состояние ожидания начала void SetStartWaitingState() { problemState = MaxFlowProblemState.StartWaiting; graphVisInterface.InteractiveMode = InteractiveMode.NonInteractive; graphVisInterface.IsVerticesMoving = false; string message = ""; if (problemMode == ProblemMode.Solution) { message = "Добро пожаловать в задание \"Максимальный поток в сети\"!" + Environment.NewLine + "Ваша задача - найти максимальный поток в представленной сети, а затем - " + "её минимальный разрез." + Environment.NewLine + "Стройте аугментальные маршруты от истока к стоку. " + "Для этого выбирайте вершины маршрута, начав с истока, и закончив в стоке." + Environment.NewLine + $"Исток - вершина {maxFlowExample.SourceVertexIndex + 1}, сток - вершина {maxFlowExample.TargetVertexIndex + 1}." + Environment.NewLine + "Если при построении маршрута Вы зашли в тупик, можете сбросить построенный маршрут кнопкой \"К началу итерации\", " + "это не повлияет на оценку." + Environment.NewLine + "Если Вы хотите начать задание заново, нажмите кнопку \"Начать заново\"." + Environment.NewLine + "Если Вы хотите вспомнить тему, откройте текст лекции с помощью кнопки \"Текст лекции\"." + Environment.NewLine + "Чтобы начать решение, нажмите кнопку \"К началу итерации\"."; } else if (problemMode == ProblemMode.Demonstration) { message = "Добро пожаловать в демонстрацию решения задачи \"Максимальный поток в сети\"!" + Environment.NewLine + "Здесь у Вас есть возможность просмотреть пошаговую демонстрацию решения задачи о максимальном потоке." + Environment.NewLine + "Для того, чтобы сделать очередной шаг решения, нажимайте кнопку \"Сделать шаг\"." + Environment.NewLine + "Вы можете начать итерацию решения заново кнопкой \"К началу итерации\"." + "Если Вы хотите начать задание заново, нажмите кнопку \"Начать заново\"." + Environment.NewLine + "Если Вы хотите вспомнить тему, откройте текст лекции с помощью кнопки \"Текст лекции\"." + Environment.NewLine + "Чтобы начать демонстрацию решения, нажмите кнопку \"К началу итерации\", " + "а затем используйте кнопки \"Сделать шаг\", \"К началу итерации\" и \"Начать заново\" для управления ходом решения."; } ShowSuccessTip(message); LockAnswerGroupBox(); buttonReloadIteration.Enabled = true; }