Предположим, у меня есть график с графическим представлением, подобным этому:
Как вы можете видеть, есть "плетеная секция", в какие разные пути можно пройти, но, если вы продолжите идти (хотя бы в одном направлении вдоль главной оси), вы неизменно окажетесь в одной и той же точке в конце «оплетки».
Этот график может простираться в любом направлении на большое расстояние и иметь несколько косичек произвольной сложности на этом пути.
Существует ли какой-либо алгоритм, способный изолировать узлы в синих кружках, указывая начало и конец "оплетка"? Или go еще дальше и просто вернуть подграф, содержащий косу, отсекаемую в этих узлах?
У меня проблемы с формулированием этой проблемы в Google, и документация для моей библиотеки графов не объясняет различные алгоритмы он реализует.
В настоящее время я использую Python NetworkX, но я не против реализации алгоритма вручную, если он не имеет прямой реализации.
Я должен также указать, что Граф в идеале может быть направлен так, чтобы все ребра были направлены вдоль одного направления большой оси, но решение, которое также могло бы использовать ориентированный граф, было бы лучше.
РЕДАКТИРОВАТЬ: Вот моя реализация, основанная на ответе из @ kaya3:
articulation_points = nx.articulation_points(graph)
for node in articulation_points:
if nx.degree(graph, node) > 2:
print(node)