Сократите листовые компоненты ориентированного графа

Учитывая ориентированный граф и некоторые его узлы, как обрезать узлы, которые не могут достичь ни одного из заданных узлов. (Я называю это листовыми компонентами, но не уверен, что это правильный термин)

Существуют ли какие-либо известные алгоритмы, решающие это эффективно?

Было бы идеально, если бы вы указали для него исходный код Java Open.

Спасибо.


person Infinite    schedule 07.10.2012    source источник
comment
Я реализовал это для данных OSM, чтобы исключить небольшие подсети: github.com/graphhopper/graphhopper/blob/master/src/main/java/   -  person Karussell    schedule 08.10.2012


Ответы (2)


Запустите поиск в ширину или поиск в глубину, начиная с заданного набора узлов, и отметьте все узлы, которые пересекает поиск. После этого все непомеченные узлы недоступны из заданного набора узлов и могут быть удалены. Если n — количество вершин, а m — количество ребер, это решит вашу проблему за O(n + m).

Лично я предпочитаю Tinkerpop Blueprints в качестве основной библиотеки для обработки графов в JVM/Java/Scala. .

person Uwe L. Korn    schedule 07.10.2012

Если я вас правильно понял, вам нужно найти сильно связанные компоненты, которые можно найти в O (n + m) раз, выполнив 2 поиска в глубину.

person dreamzor    schedule 07.10.2012