ラベル付きのグラフを作成しました。
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS,
Item, Link > UnGraph;
私のラベルはuint64_tです。グラフに自分のIDを表示したいと思います。
ノードを追加すると、すべてが正常になり、ラベルが付いたノードしかありません。
m_g.add_vertex(nodeId, Item(nodeId));
ラベルがグラフにあるかどうかを確認したい:
auto BUnGraph::exists( nid source ) const -> bool
{
if( m_g.vertex(source) == BUnGraph::null_vertex() )
return false;
else
return true;
}
しかし、方法:
vertex(source)
誤った結果が返され、ラベルに応じてnull_vertex()ではなく、ノードがグラフにない場合にデフォルトで作成されたvertex_descriptorが返されます...
私はブーストでメソッドを分離しました:
labeled_graph.hpp
/** @name Find Labeled Vertex */
//@{
// Tag dispatch for sequential maps (i.e., vectors).
template <typename Container, typename Graph, typename Label>
typename graph_traits<Graph>::vertex_descriptor
find_labeled_vertex(Container const& c, Graph const&, Label const& l,
random_access_container_tag)
{ return l < c.size() ? c[l] : graph_traits<Graph>::null_vertex(); }
内部マップを確認しました。グラフに単一のノードを追加すると、map.size()== 42になります。1ではなく!5つのノードを追加するとsize()==248。
IDに応じて、マップサイズは次のようになります。最大ラベル値* 2 + 2 したがって、map.size()よりも小さいラベル番号は誤った結果になります。
どうしたの ?
編集:グラフに60000000のようなラベルを1つのノードだけに配置しました。コンピュータのメモリが不足しました...