Два двусторонне связанных блока соединены одной направленной связью. Слабая связность объединяет их, сильная оставляет два блока.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Учебная база платформы 8.5.1.1343, серверный общий модуль УчебныеЗадачи. Фрагмент вставьте в тело ВыполнитьПример() Экспорт и вызовите из серверной команды собственной обработки.
Все таблицы создаются в памяти. Документы, регистры, расчёт себестоимости конфигурации и внешние сервисы не используются.
Номера уравнений и переменных 0 и 1 в этих задачах — собственные ключи. Имена колонок передаются явно; индексы коллекций начинаются с 0.
Не запускайте расчёт больших матриц на рабочем сервере по аналогии с уроком: здесь только две неизвестные и контроль заранее известного решения.
Эта задача только анализирует граф. Не задавайте источник свободных членов и не запускайте РассчитатьСистемыЛинейныхУравнений для этой матрицы связности.
Связи = Новый ТаблицаЗначений;
Связи.Колонки.Добавить("Уравнение", Новый ОписаниеТипов("Число"));
Связи.Колонки.Добавить("Переменная", Новый ОписаниеТипов("Число"));
Связи.Колонки.Добавить("Вес", Новый ОписаниеТипов("Число"));
Ребра = Новый Массив;
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 0, 1, 1));
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 1, 0, 1));
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 1, 2, 1));
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 2, 1, 1));
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 3, 4, 1));
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 4, 3, 1));
Ребра.Добавить(Новый Структура("Уравнение,Переменная,Вес", 2, 3, 1));
Для Каждого Ребро Из Ребра Цикл
НоваяСвязь = Связи.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСвязь, Ребро);
КонецЦикла;
Расчет = Новый РасчетСистемЛинейныхУравнений;
Расчет.ИсточникДанныхСвязей = Связи;
Расчет.КолонкаУравненияВСвязях = "Уравнение";
Расчет.КолонкаПеременныеВСвязях = "Переменная";
Описание = Расчет.ОписанияСистем.Добавить();
Описание.КолонкаКоэффициентовВСвязях = "Вес";
// Для методов графа КолонкаКоэффициентовВУзлах не задаётся.
Слабые = Расчет.ПолучитьКомпонентыСвязности(СпособПолученияКомпонентСвязностиРасчетаСистемЛинейныхУравнений.КомпонентыСлабойСвязности);
Сильные = Расчет.ПолучитьКомпонентыСвязности(СпособПолученияКомпонентСвязностиРасчетаСистемЛинейныхУравнений.КомпонентыСильнойСвязности);
СлабыеПоУзлу = Новый Соответствие;
Для Каждого СтрокаКомпоненты Из Слабые Цикл
СлабыеПоУзлу.Вставить(СтрокаКомпоненты[0], СтрокаКомпоненты[1]);
КонецЦикла;
СильныеПоУзлу = Новый Соответствие;
Для Каждого СтрокаКомпоненты Из Сильные Цикл
СильныеПоУзлу.Вставить(СтрокаКомпоненты[0], СтрокаКомпоненты[1]);
КонецЦикла;
Сообщить(Слабые.Количество() = 5 И Сильные.Количество() = 5);
Сообщить(СлабыеПоУзлу.Получить(0) = СлабыеПоУзлу.Получить(4));
Сообщить(СильныеПоУзлу.Получить(0) = СильныеПоУзлу.Получить(1));
Сообщить(СильныеПоУзлу.Получить(1) = СильныеПоУзлу.Получить(2));
Сообщить(СильныеПоУзлу.Получить(3) = СильныеПоУзлу.Получить(4));
Сообщить(СильныеПоУзлу.Получить(0) <> СильныеПоУзлу.Получить(3));
Глубина = Расчет.ПолучитьГлубинуГрафа(0);
Сообщить(ТипЗнч(Глубина) = Тип("Число") И Глубина > 0);
Сообщить("Глубина поиска от собственной вершины 0 по API: " + Строка(Глубина));Разбор по шагам
Собственные вершины 0/1/2 взаимно достижимы, 3/4 тоже. Между блоками есть только одна направленная связь.
По текущей справке методы графа требуют источника связей, двух ключевых колонок и одного описания только с колонкой коэффициентов в связях.
Явно выбираем слабые и сильные компоненты. Не полагаемся на меняющееся с режимом совместимости значение по умолчанию.
Результат содержит номер узла в первой колонке и номер компоненты во второй. Сохраняем соответствие и сравниваем членство, не выдумываем постоянные номера компонент.
В слабом графе блоки связаны; в сильном единственного направления между ними недостаточно для взаимной достижимости.
ПолучитьГлубинуГрафа использует существующую вершину 0. Выводим значение API, не подменяем его числом неизвестных или минимальным расстоянием.
Как проверить результат
Семь булевых сообщений Истина: по пять узлов, нужные совпадения/различия компонент и числовая положительная глубина.
Первая и последняя вершины принадлежат одной слабой, но разным сильным компонентам; конкретные номера компонент не фиксируются.
Ожидаемый результат
Структура зависимостей разобрана отдельно от численного решения системы.
На что обратить внимание
Связность не доказывает существование единственного решения или невырожденность матрицы.
Глубина поиска в глубину не равна кратчайшему расстоянию и не является временем расчёта.
Графовые методы здесь вызываются с одним описанием без свободных членов, согласно специальному контракту API.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.