У меня есть ориентированный граф, и я хочу получить родительский элемент данной вершины.Как получить входные ребра заданной вершины на ориентированном графе?
Скажем, у меня есть график 1 -> 2 -> 3
, я держу вершину 2
, и я хочу получить вершину 1
.
Мои вершинных и график определения:
struct TreeVertex { int id = -1; };
typedef boost::adjacency_list<
boost::vecS,
boost::vecS,
boost::directedS,
TreeVertex
> tree_t;
MVCE показывая, что я хочу достичь (см online here):
int main() {
tree_t tree;
auto v1 = boost::add_vertex(tree);
auto v2 = boost::add_vertex(tree);
auto v3 = boost::add_vertex(tree);
boost::add_edge(v1, v2, tree);
boost::add_edge(v2, v3, tree);
// attempt to get the input edge of v2
auto pair_it_edge = boost::in_edges(v2, tree); // FAILS TO BUILD
auto v = boost::source(*pair_it_edge.first); // should be v1
}
Another answer предполагает преобразование графа в BidirectionalGraph
, но мне нужно, чтобы сохранить это было направлено.
Вопрос: Возможно ли это? Как я могу получить входящий край v2
, чтобы я мог извлечь v1
?
Без использования двунаправленного графика вам нужно будет выполнить поиск грубой силы всех узлов, ища тот, у которого есть вершина 2 в качестве ее дочернего элемента. Возможно, стоит создать временную бидердеральную копию вашего графика, чтобы сохранить выполнение поиска. – ravenspoint
Спасибо, на самом деле я не уверен, что правильно получил двунаправленные графики: если они двунаправленные, как я могу использовать ребро '1 <-> 2', а не' 2 <-> 3', используя 'boost :: in_edges() '? Что-то непонятное для меня на [странице] (http://www.boost.org/doc/libs/1_60_0/libs/graph/doc/BidirectionalGraph.html). – kebs
@ravenspoint, если у вас все равно будет временный график, почему бы не создать второй ориентированный граф, где все ребра перевернуты ... Используя двунаправленный, вам нужно будет искать и искать в исходном графе, если край вы считаете, что это в или из-за края ... Я, возможно, что-то пропустил, но я думаю, что это будет чище и даже будет немного меньше накладных расходов. В псевдо: 'for (out_edges (v, tree_copy)) {print target как источник и vicecersa}' vs. 'for (edge (v, tree_bi_copy)) {проверьте, включено ли или нет. if in print else skip} ' – dingalapadum