Маркировка групп вершин в графике эффективно без BFS / DFS

cs.stackexchange https://cs.stackexchange.com/questions/128170

Вопрос

У меня есть график с набором вершин $ \ mathcal {v} $ и набор ребер $ \ mathcal {e} $ . Существует путь между каждыми 2 вершинами на графике. К каждому краю существует ассоциированный вес $ W (E), e \ in \ mathcal {e} $ . Я определяю (глобальный) порог $ T $ такой, что если $ W ((U, V)) Две вершины $ u, v \ in \ mathcal {v} $ находятся в той же группе: $ g \ in \ mathcal {v} \ priverarrow \ mathbb {z}, g (v_1)= g (v_2) $ . Это поведение транзитивно. Цель состоит в том, чтобы обозначить различные группы, начиная с нуля (порядок групп не имеет значения). Я знаю, что это может быть достигнуто тривиально с BFS или DFS, но я хочу избежать использования тех.

Идея, с которой я придумал, - это повторять вершины, перейти на их 1-кольцевое соседство и создать новую группу каждый раз, когда $ w ((u, v) ) Для любых краев и ни $ u $ no it u $ nary $ v $ были назначены группу (например, $ g (u)= g (v)= -1 $ ). Кроме того, каждая группа присваивается метку, которая первоначально равна индексу группы: $ h: \ mathbb {n} \ prightarrow \ mathbb {n}, h (g (g ( U))= g (u) $ . Если в какой-то момент $ w ((x, y)) и $ W ((y, z)) , но $ g (x) \ ne g (z) $ затем установите $ h ( g (x)) \ левовида \ min (h (g (x)), h (g (z)) $ и $ h (g (z)) \ ledearrow h (g (x)) $ . После этой процедуры он должен удерживать: $ h (g (u))= h (g (v)), u, v \ in \ mathcal {v} $ Если существует путь от $ u $ на $ v $ : $ \ pi= e_1, ..., e_n $ такой, что $ W (E_I) . Это алгоритм, который я придумал правильно или я что-то пропустил? Как оно в настоящее время требует $ | \ mathcal {v} | $ память Для каждого массива $ g, h $ . Есть ли способ оптимизировать это дальше?

Это было полезно?

Решение

Как вы выделяете в Ваши комментарии , разумный подход - удалить все края с весом $ \ GE T $ , затем вычислитьподключенные компоненты результирующего графа (используя любой стандартный алгоритм для вычисления подключенных компонентов).

Другие советы

Я верю, что мой алгоритм правильный. Эскиз доказательства представлен ниже:

Есть 2 случая: либо $ u \ ne v \ in \ mathcal {v} $ нужно быть из одной группы, или они должны быть из Разные группы (в зависимости от того, существует ли путь между ними такими, что $ w (e) ). Необходимо показано, что алгоритм создает результирующие группы (доказательство для каждого случая будет выполняться противоречивым).

  1. case 1: пусть $ u, v \ in \ mathcal {v} $ и есть путь от $ u $ to $ v $ : $ \ pi= e_1, ..., e_n $ такой, что $ w (e_i) . Затем $ H (G (u)) $ должен равняться $ h (g (v)) $ для алгоритм будет правильным.

  2. Предположение алгоритма Неправильность: предположим, что это не так, и что $ u $ , $ V $ принадлежат различным группам, основанным на результате алгоритма. Для простоты предположим, что $ \ pi=pi_1, x, y, z, \ pi_2; \, x, y, z \ in \ mathcal {v} $ такой Что все вершины из $ \ pi_1, x $ относятся к $ h (g (u)) $ и Все вершины на $ y, z, \ pi_2 $ принадлежат $ h (g (v)) $ на основе алгоритма. Случай после вышеупомянутого предположения будет доказано, но должно быть ясно, что то же самое придерживается индукции, даже если $ \ pi $ разделен на большее количество групп на основе алгоритм.

  3. Доказательство противоречия: от (1) следует за $ W (x, y) , а из (2) следует: $ h (g (x)) \ ne h (g (z)) $ . Из определения алгоритма следует, что он никогда не разбивает группы, и он объединяет две группы, если $ w (x, y) но $ h (g (x)) \ ne h (g (z)) $ . Поскольку алгоритм переходит на все края, он должен иметь объединение $ h (G (x)) $ и $ h (g (g ( z)) $ .

    1. case 2: $ u, v \ in \ mathcal {v} $ и нет пути $ \ pi $ from $ u $ to $ v $ такой, что $ W (E) , затем $ h (g (u))= h (g (v)) $ .

    2. Предположение алгоритма. Неправильность: предположим, что $ h (g (u))= h (g (v)) $ .

    3. Доказательство противоречия: как при создании группы, так и в объединении групп (единственные два способа для достижения вершин в той же группе), должны существовать путь между $ u $ и $ v $ такой, что $ W (E) . (3) утверждает, что такой путь не существует, то $ h (g (u)) \ ne h (g (v)) $ .

      Очевидно, что доказательство довольно неформальное, поэтому я мог пропустить что-то. Я оставлю вопрос открытым на некоторое время, потому что 1) кто-то может придумать лучше и оптимизировать Algoritm, а 2) У меня может быть ошибка в моем доказательстве.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top