Примечание: ответ отредактирован.
Любой метод может оказаться очень медленным. Если вам нужно сделать это несколько раз, лучше всего найти связанные компоненты графика, после чего задача становится тривиальной операцией O (1): если два человека находятся в одном компоненте, они соединяются.
Обратите внимание, что нахождение подключенных компонентов в первый раз может быть медленным, но их обновление будет обновляться по мере добавления новых ребер / узлов в график.
Существует несколько методов поиска подключенных компонентов.
Один из способов - построить лапласиан графа и посмотреть на его собственные значения / собственные векторы. Число нулевых собственных значений дает вам количество подключенных компонентов. Ненулевые элементы соответствующих собственных векторов дают узлы, принадлежащие соответствующим компонентам.
Другой способ заключается в следующем:
Создать таблицу преобразования узлов. Элемент n
массива содержит индекс узла, в который преобразуется узел n
.
Зациклить все ребра (i,j)
на графике (обозначая связь между i
и j
):
- Вычислить рекурсивно , какой узел преобразует
i
и j
в текущую таблицу. Обозначим результаты как k
и l
. Обновите запись k
, чтобы преобразовать ее в l
. Обновите записи i
и j
, указав также l
.
Повторно переберите таблицу и обновите каждую запись, указав непосредственно на узел, который рекурсивно преобразуется в.
Теперь узлы в одном подключенном компоненте будут иметь одну и ту же запись в таблице преобразования. Поэтому, чтобы проверить, соединены ли два узла, просто проверьте, не преобразовываются ли они в одно и то же значение.
Каждый раз, когда на график добавляется новый узел или ребро, таблицу преобразований необходимо обновлять, но это обновление будет намного быстрее, чем первоначальный расчет таблицы.