удаление вершины и всех ее соседей из графа с помощью библиотеки повышения С++

Я хочу удалить вершину w со своими соседями из графа G.

Мой код:

// remove all neighbours
MyGraph::adjacency_iterator n_iter, n_end;
for (tr1::tie(n_iter, n_end) = boost::adjacent_vertices (*w, G1); n_iter != n_end; ++n_iter)
{
    boost::remove_vertex(*n_iter, G1);
}

MyGraph::vertex_iterator vertex_iter, vertex_end;
Vertex vertex_w = G[*w];

// remove vertex himself
for (tr1::tie(vertex_iter, vertex_end) = boost::vertices(G1);vertex_iter != vertex_end; ++vertex_iter)
{
    Vertex vertex = G1[*vertex_iter];
    if (vertex.p_index == vertex_w.p_index)
    {
        boost::remove_vertex(*vertex_iter, G1);
        break;
    }
}

Я попытался перебрать соседние вершины и удалить их. После этого я попытался удалить вершину w.

Но при запуске программы возникают некоторые исключения и ошибки.

Есть ли у кого-нибудь подсказка, как удалить Vertex w со всеми его соседями из графа?

Обновление: теперь я понимаю, почему приведенный выше код не работает (я использую VertexList=vecS). Теперь я пытаюсь пометить вершину как «удаленную» и хочу удалить все ребра.

График:

0     1
o-----o
|     |
|     |
o-----o
2     3

Код:

typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS, Vertex, Edge> MyGraph;
[...]
// *w is Vertex "1"
boost::graph_traits<MyGraph>::adjacency_iterator n_iter, n_end, next;
for (tr1::tie(n_iter, n_end) = boost::adjacent_vertices (*w, G1); n_iter != n_end; ++n_iter)
{
    cout << G1[*n_iter].p_index << endl;
    G1[*n_iter].Graph_Part = Graph_Part::R;
    // boost::clear_vertex(*n_iter, G1); <-- problem
 }
cout << endl << "----" << endl;

Если я раскомментирую метод clear_vertex, результат будет таким:

0
3

Если программа удалит ребра *n_iter, вывод будет только:

0

- цикл завершается после одной итерации.


person take    schedule 24.04.2012    source источник


Ответы (1)


Посмотрите здесь. remove_vertex не изменит никаких ребер. Сначала вам нужно clear_vertex его.

Общий совет: не используйте квалифицированные вызовы библиотеки boost::graph, называйте их неквалифицированными. Я бы также предложил Boost.Range для обработки итерации в такие простые случаи. Это держит прицел чище и намного красивее.

person pmr    schedule 24.04.2012
comment
Привет, я обновил свой вопрос. Я благодарен, если вы можете посмотреть на обновление. - person take; 25.04.2012
comment
В чем преимущество использования неквалифицированных вызовов в этом случае? Я понимаю это для swap и т. д., но не здесь. - person user1520427; 30.11.2013
comment
@user1520427 user1520427 BGL расширяется почти так же, как std::swap. Если вы адаптируете свою собственную структуру данных к типу Graph, вы добавите дополнительные функции в то же пространство имен, что и ваша структура данных. - person pmr; 30.11.2013