По поводу планарности ...
Хорошо известные критерии e <= 3v - 6 <a href="http://en.wikipedia.org/wiki/Planar_graph" rel="noreferrer">, указанные Эуллером , упомянутые здесь, говорят о том, что если график плоский, то это условие должно выполняться. Однако не все графики, в которых выполняется это условие, обязательно являются плоскими. Вот почему вам на самом деле нужен алгоритм проверки на плоскостность .
Следует отметить, что алгоритмы тестирования на плоскостность нелегко реализовать. Есть очень старая, основанная на поиске и удалении подграфов. Я не могу вспомнить оригинальных авторов прямо сейчас, но проблема их алгоритма в том, что он имеет сложность O (n³).
Первый алгоритм проверки на плоскостность, который считается эффективным (в данном случае O (n)), принадлежит Хопкрофту и Тарьяну. Об этом уже упоминалось здесь в посте Инь Чжу. Вы можете найти оригинальную статью здесь .
На этот раз проблема с алгоритмом заключалась в том, что многим людям было трудно его понять и даже реализовать. Таким образом, есть бумаги с намерением просто прояснить пункты оригинальной статьи. Например, бумага Kocay .
Статья Хопкрафта-Тарьяна является классической, и если вы хотите попытаться реализовать ее, лучшая ссылка, которую я имею, это эта другая статья , которая представляет теорию вместе с реализацией C ++. Это было написано людьми, которые реализовали алгоритм в библиотеке LEDA .
Спустя годы после статьи Хопкрофта-Тарьяна (которая была в 1974 году) были опубликованы другие алгоритмы O (n). Я не знаю много о них, но некоторые использовали деревья PC / PQ. Однако есть один, который я прочитал и нашел очень интересным. Это из-за Бойера и Мирволда, и это с 2004 года. Вы можете найти это здесь . Помимо самого алгоритма, конечно, хорошо в этой статье то, что он содержит строгую историческую справку об алгоритмах теста на плоскость.
Совсем недавно я обнаружил другую статью от 2008 года, в которой Тарджан является одним из авторов. Еще не проверили.
Ну, если вы устали, просто прочитав этот пост, я предполагаю, что вы не хотите реализовывать свой собственный алгоритм. :) В этом случае я могу порекомендовать некоторые библиотеки C ++.
- Повышение .
- GDToolkit .
- ЛЕД .
- OGDF .
- GTAD - Это моя собственная библиотека графов (которая, к сожалению, в последнее время я не смог над ней поработать). Есть реализация алгоритма Хопкрофта-Тарьяна, которую я написал на основе упомянутой мной статьи. Поскольку документ уже содержит реальный код, все намного проще.