Как найти замкнутые петли в графовых сетях - PullRequest
1 голос
/ 11 августа 2011

У меня есть сеть ненаправленных графов, состоящая из улиц и пересечений, и я хотел бы знать, есть ли какой-нибудь алгоритм, помогающий мне находить замкнутые петли, то есть места, где я могу размещать здания. Любая помощь приветствуется, спасибо!

Ответы [ 2 ]

1 голос
/ 12 августа 2011

Основываясь на комментариях к моему более раннему ответу:

Кажется, что все графики являются ненаправленными и плоскими, то есть могут быть встроены в 2D-плоскость без пересечения ребер, и одно такое вложениедано.Это вложение разделит плоскость.Например, фигура 8 разделяет плоскость на три части: две «внутренние» области и бесконечная внешняя область.Альтернативное представление состоит в том, что все ребра узла циклически упорядочены.(Это важная часть, которая позволяет нам применять теорию графов)

Разделение обязательно заключено в цикл, но не все циклы могут разделять одну область.В тривиальном случае на рисунке 8 все три области непосредственно связаны с отдельным циклом.

Входной граф в общем случае может быть упрощен.Некоторые узлы могут иметь только одно ребро;они не могут способствовать разделению и могут быть удалены вместе с краем.Другие узлы имеют два ребра, соединяющих разные узлы.Здесь узел и два ребра могут быть заменены прямым ребром, соединяющим соседей.Т.е. граф на рисунке 8 можно упростить до двух узлов и трех ребер между ними.(Это не обязательный шаг, но помогает вычислению).

Теперь каждая вершина будет иметь две области по обе стороны (так как они не направлены, «левый и правый» не являются очевидными различиями).Итак, для |V| вершин нам нужно рассмотреть 2 * |V| сторон.Они вообще не различны.Два смежных ребра (соединенных с одним и тем же узлом) могут граничить с одной и той же областью, если они также смежны в циклическом порядке ребер этого узла.Очевидно, что для узлов, имеющих только два ребра, два ребра совместно используют обе области (именно поэтому мы удалили их на предыдущем шаге).Для узлов с тремя ребрами любые два ребра имеют общую не менее одну область.

Итак, вот как перечислить эти области: Присвойте порядковый номер всем ребрам и вершинам.Назначьте направление каждому ребру, чтобы он проходил от края с меньшим номером к верхнему.Начните с вершины 1, правой стороны и пронумеруйте эту область 1. Обведите граничные ребра этой области, присвоив то же число 1 соответствующим сторонам ее граничных ребер.Вы делаете это, беря в каждом узле следующее смежное ребро в контрциклическом порядке.Когда вы вернетесь к исходной точке, вы знаете все граничные области ребер 1.

Затем вы проверяете левый край первой вершины.Если это не часть области 1, то это область 2, и вы применяете тот же алгоритм.Затем, проверьте вершину 2, правую сторону и левую сторону и т. Д. Каждый раз, когда вы найдете ребро и сторону, которая еще не пронумерована, присвойте номер следующей области и проследите края недавно основанной области.

Естьнебольшая проблема с определением, какой номер области соответствует бесконечности.Чтобы увидеть это, возьмем простой график (): два ребра, два узла и две области (внутри и снаружи).Из-за случайной нумерации ребер и вершин внешняя сторона может закончиться как 1 или 2. Это неизбежно;в теории графов нет различия между внутренним и внешним.

0 голосов
/ 11 августа 2011

Это стандартная функция в библиотеке Boost Graph.Подробнее см. этот предыдущий ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...