Обнаружение циклов в неориентированном графике с помощью библиотеки графов

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

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

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

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

Вот код, который я получил и поиграл с 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() это просто исходная и целевая вершины.

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

0 ответов

Другие вопросы по тегам