В моем приложении у меня есть своего рода график, где каждый узел / вершина может быть связан друг с другом, но фактическое соединение определяется во время выполнения.
Конечно, это тривиально реализовать путем итерации по всем существующим вершинами соединяя их с последним, который я добавил к графу, и используя отфильтрованный граф во время выполнения, чтобы решить, что соединение все еще сохраняется.
Цель состоит в том, чтобы использовать BFS или DFS или другие алгоритмы, предоставляемые BGL.
Есть ли другой подход для более эффективного выполнения этой задачи?Например: добавление всех (!) Вершин при инициализации и наличие какого-то обратного вызова, который проверяет ребро во время выполнения?
Вот как я пытался это решить, но этот не работает:
#include <boost/graph/adjacency_matrix.hpp>
#include <boost/graph/graph_utility.hpp>
struct VD { };
struct ED { };
struct Graph : boost::adjacency_matrix<boost::directedS, VD, ED>
{
Graph() : boost::adjacency_matrix<boost::directedS, VD, ED>(4) { }
//=================================================================
// Functions required by the AdjacencyMatrix concept
template <typename D, typename VP, typename EP, typename GP, typename A>
std::pair<typename adjacency_matrix<D,VP,EP,GP,A>::edge_descriptor, bool>
edge(typename adjacency_matrix<D,VP,EP,GP,A>::vertex_descriptor u,
typename adjacency_matrix<D,VP,EP,GP,A>::vertex_descriptor v,
const adjacency_matrix<D,VP,EP,GP,A>& g)
{
// Connect vertex 1 and 2
bool exists = (u == 1 && v == 2);
typename boost::adjacency_matrix<D,VP,EP,GP,A>::edge_descriptor
e(exists, u, v, boost::detail::get_edge_property(g.get_edge(u,v)));
return std::make_pair(e, exists);
}
};
int main() {
Graph g;
print_graph(g);
std::vector<int> component(num_vertices(g));
int num = boost::connected_components(g, &component[0]);
}
Буду признателен за любые указатели!