Кто-нибудь знает эффективный алгоритм для вычисления линейного орграфа из орграфа? См. http://en.wikipedia.org/wiki/Line_graph (в статье Википедии упоминается случай орграфа внизу (в разделах «Обобщения») В идеале я хотел бы сделать это за линейное время.
Из этого раздела:
- Если G — ориентированный граф, его ориентированный линейный граф или линейный орграф имеет по одной вершине для каждого ребра графа G.
- Две вершины, представляющие направленные ребра от u до v и от w до x в G, соединены ребром от uv до wx в линейном орграфе, когда v = w.
Пусть G — ориентированный граф. Пусть L(G) — линейный ориентированный граф.
Алгоритм, который я могу придумать для получения L(G) при заданном G:
- Перебрать все ребра G, чтобы получить узлы L(G)
- Перебрать все пары узлов (uv, wx) в L(G) и соединиться, если v = w
Это алгоритм O (n ^ 2).
Похоже, должен быть способ сократить это время до O(n). Я собираюсь подумать об этом, но я решил спросить переполнение стека на всякий случай, если есть какой-то известный (или не очень известный) алгоритм для этого, о котором я не знаю.