Обнаружение циклов в неориентированном графе с использованием библиотеки графов буста - PullRequest
3 голосов
/ 09 марта 2012

Со вчерашнего дня я застрял с этой проблемой. К сожалению / к счастью, эта проблема составляет всего около 0,5% от моего супер огромного (для меня новичка в c ++), таким образом, требуется библиотека существующего кода, которую можно просто адаптировать и заставить работать.

Я хотел бы обнаружить и выдать все круги на неориентированном графике. Мои края не взвешены. Да, мне действительно нужны все циклы, т.е. что-то вроде всех гамильтоновых циклов ориентированного графа

Я играл с расширенной библиотекой графов, алгоритм DFS казался очень многообещающим, однако он посещает вершины только один раз и поэтому не может дать все гамильтоновы круги.

На данный момент мне просто нужен код для работы, чтобы я мог продолжить разработку алгоритма, после чего я мог бы рассмотреть проблемы с производительностью. Приветствуется даже решение с 5-вложенными циклами for.

Вот код, который я получил и поиграл с boost, но я не знаю, как записывать и получать доступ к моим предшественникам back_edges, и даже если это было решено, boost DFS посетит вершины только один раз:

struct detect_loops : public boost::dfs_visitor<>
{
   template <class Edge, class Graph>
   void back_edge(Edge e, const Graph& g) {
      std::cout << source(e, g)
        << " -- "
        << target(e, g) << "\n";
   }
};

int main(int,char*[])
{
    typedef std::pair<int,int> Edge;
    std::vector<Edge> edges;
    edges.push_back(Edge(0,1));
    edges.push_back(Edge(1,2));
    edges.push_back(Edge(2,3));
    edges.push_back(Edge(3,1));
    edges.push_back(Edge(4,5));
    edges.push_back(Edge(5,0));
    edges.push_back(Edge(4,0));
    edges.push_back(Edge(5,6));
    edges.push_back(Edge(2,6));

    typedef adjacency_list<
       vecS, vecS, undirectedS, no_property,
       property<edge_color_t, default_color_type>
    > graph_t;
    typedef graph_traits<graph_t>::vertex_descriptor vertex_t;

    graph_t g(edges.begin(), edges.end(), 7);

    std::cout << "back edges:\n";
    detect_loops vis;
    undirected_dfs(g, root_vertex(vertex_t(0)).visitor(vis).edge_color_map(get(edge_color, g)));
    std::cout << std::endl;

    return 0;
} 

В приведенном выше примере говорится, что обычно всего 3 цикла, и я ожидаю более 4, в результате чего одна вершина может появиться в нескольких циклах. И, во-вторых, я даже не могу получить доступ ко всем трем циклам, которые дает back_edge() буста, вот так std::vector<uInt32> fCycle1, fCycle2,fCycle3. Все, что я получаю от back_edge(), это только исходные и целевые вершины.

Буду благодарен за любую помощь и советы. Пока что все приведенные здесь примеры просто обнаружат наличие цикла или его количество, но ни один из них не показал, как составить список всех присутствующих циклов.

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