将vertex_index添加到listS图中即时为中间中心 [英] Adding a vertex_index to listS graph on the fly for betweenness centrality

查看:490
本文介绍了将vertex_index添加到listS图中即时为中间中心的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

更新:问题可能出现在中间代码之间。如果我注释掉对 brandes_betweenness_centrality 的调用,代码将编译。问题可能不是如先前设想的索引设置。如果你能提出一个替代调用brandes_betweenness_centrality,这将允许保持索引外部。我会奖赏奖。



我试图转换我的一些旧vecS代码使用listS,特别是 brandes_betweenness_centrality 算法。



我试图保留顶点和边缘属性非常轻的重量和工作主要与外部性能。这样做的原因是我现在不知道我要与他们联系到什么。



我得到的错误来自内部 adjacency_list.hpp 所以我想问题是与我们的老朋友 vertex_index_t 与listS。



以下代码显示了如何重现编译错误。在这个工作示例中,您可以更改定义以将vertex_index填充到图形定义中,并更改完全工作代码之间的betweenness方法(在正确运行之间运行)。



完整的范例:

  #include< iostream& 
#include< algorithm>
#include< vector>

#include< boost / graph / adjacency_list.hpp>
#include< boost / graph / graph_traits.hpp>
#include< boost / graph / betweenness_centrality.hpp>

#include< boost / timer.hpp>

using namespace std;

enum edge_t {A,B};

struct VertexProperties {
std :: string id;
};

struct EdgeProperties {
edge_t type;
};

// vertex_index作为内部属性,切换到此图形并更改为工作代码的顶点映射
// typedef boost :: adjacency_list< boost :: listS,boost :: listS,boost :: undirectedS,
// boost :: property< boost :: vertex_index_t,size_t,VertexProperties> ;, EdgeProperties>动态网;

//没有内部vertex_index
typedef boost :: adjacency_list< boost :: listS,boost :: listS,boost :: undirectedS,
VertexProperties,EdgeProperties>动态网;

typedef boost :: graph_traits< DynamicNet> :: vertex_descriptor DynamicNetVertex;
typedef boost :: graph_traits< DynamicNet> :: vertex_iterator DynamicNetVI;

typedef boost :: graph_traits< DynamicNet> :: edge_descriptor DynamicNetEdge;
typedef boost :: graph_traits< DynamicNet> :: edge_iterator DynamicNetEI;


void calcBetweenness(DynamicNet& g,
std :: vector< double>& v_centrality_vec,
std :: vector< double>& e_centrality_vec) ;


int main(int argc,char * argv []){
cout< 中间性< endl;

DynamicNet net;

// 1,在图(a-h)中,添加z修改添加到
//http://www.boost.org/doc/libs/1_58_0/libs/graph/doc/betweenness_centrality.html
DynamicNetVertex a = boost :: add_vertex(net); net [a] .id =a;
DynamicNetVertex b = boost :: add_vertex(net); net [b] .id =b;
DynamicNetVertex c = boost :: add_vertex(net); net [c] .id =c;
DynamicNetVertex d = boost :: add_vertex(net); net [d] .id =d;
DynamicNetVertex e = boost :: add_vertex(net); net [e] .id =e;
DynamicNetVertex f = boost :: add_vertex(net); net [f] .id =f;
DynamicNetVertex g = boost :: add_vertex(net); net [g] .id =g;

// core
DynamicNetVertex h = boost :: add_vertex(net); net [h] .id =h;

boost :: add_edge(a,h,net);
boost :: add_edge(b,h,net);
boost :: add_edge(c,h,net);
boost :: add_edge(d,h,net);
boost :: add_edge(e,h,net);
boost :: add_edge(f,h,net);
boost :: add_edge(g,h,net);

//添加边以使计算更有趣
DynamicNetVertex z = boost :: add_vertex(net); net [z] .id =z;
boost :: add_edge(a,z,net);



矢量< double> v_centrality_vec(boost :: num_vertices(net),0.0);
矢量< double> e_centrality_vec(boost :: num_edges(net),0.0);

boost :: timer t;
t.restart();
calcBetweenness(net,v_centrality_vec,e_centrality_vec);
double s = t.elapsed();
cout<< s < s< endl;
cout<< endl;

cout<< 顶点之间< endl;
DynamicNetVI vi,ve;
size_t i = 0;
for(boost :: tie(vi,ve)= boost :: vertices(net); vi!= ve; ++ vi){
cout< net [* vi] .id < \t<< v_centrality_vec.at(i)<< endl;
++ i;
}

cout<< endl;

cout<< 边缘之间<< endl;
DynamicNetEi ei,ee;
i = 0;
for(boost :: tie(ei,ee)= boost :: edges(net); ei!= ee; ++ ei){
DynamicNetEdge e = * ei;
cout<< net [boost :: source(e,net)]。id<< \t
<< net [boost :: target(e,net)]。id<< \t<< e_centrality_vec.at(i)<< endl;
++ i;
}

cin.get();
}

void calcBetweenness(DynamicNet& g,
std :: vector< double>& v_centrality_vec,
std :: vector< double>& e_centrality_vec )
{
std :: cout<< 中间称为 std :: endl;

// vertex
//取消注释并更改为上面的工作代码的内部顶点图。

/ *
typedef std :: map< DynamicNetVertex,size_t> StdVertexIndexMap;
StdVertexIndexMap viMap;
typedef boost :: property_map< DynamicNet,boost :: vertex_index_t> :: type VertexIndexMap;
VertexIndexMap v_index = boost :: get(boost :: vertex_index,g);
DynamicNetVI vi,ve;
size_t i = 0;
for(boost :: tie(vi,ve)= boost :: vertices(g); vi!= ve; ++ vi){
boost :: put(v_index,* vi,i) ;
++ i;
}
boost :: iterator_property_map< std :: vector& double> :: iterator,VertexIndexMap>
v_centrality_map(v_centrality_vec.begin(),v_index);
* /

//这个代码完全模仿边缘使用的工作方式导致错误
typedef std :: map< DynamicNetVertex,size_t> StdVertexIndexMap;
StdVertexIndexMap viMap;
typedef boost :: associative_property_map< StdVertexIndexMap> VertexIndexMap;
VertexIndexMap v_index(viMap);
DynamicNetVI vi,ve;
size_t i = 0;
for(boost :: tie(vi,ve)= boost :: vertices(g); vi!= ve; ++ vi){
boost :: put(v_index,* vi,i) ;
++ i;
}
boost :: iterator_property_map< std :: vector& double> :: iterator,VertexIndexMap>
v_centrality_map(v_centrality_vec.begin(),v_index);



//边缘,这个appraoch工作正常边缘
typedef std :: map< DynamicNetEdge,size_t> StdEdgeIndexMap;
StdEdgeIndexMap eiMap;
typedef boost :: associative_property_map< StdEdgeIndexMap> EdgeIndexMap;
EdgeIndexmap e_index(eiMap);
DynamicNetEi ei,ee;
i = 0;
for(boost :: tie(ei,ee)= boost :: edges(g); ei!= ee; ++ ei){
boost :: put(e_index,* ei,i) ;
++ i;
}
boost :: iterator_property_map< std :: vector& double> :: iterator,EdgeIndexMap>
e_centrality_map(e_centrality_vec.begin(),e_index);

brandes_betweenness_centrality(g,v_centrality_map,e_centrality_map);
}

错误:

 错误1错误C2182:'reference':非法使用类型'void'... \boost_1_58_0\boost\graph\detail\adjacency_list.hpp 2543 
错误2错误C2182:'const_reference':非法使用类型'void'... \boost_1_58_0\boost\graph\detail\adjacency_list.hpp 2544

MSVS输出:

  1& --- Build started:项目:testBetweenness,配置:发布

Win32 ------
1>编译...
1> testBetweenness.cpp
1> ... \boost_1_58_0\boost / graph / detail / adjacency_list.hpp(2543):error C2182:'reference':非法使用类型'void'
1> ... \boost_1_58_0 \boost / graph / detail / adjacency_list.hpp(2619):参见类模板实例化'boost :: adj_list_any_vertex_pa :: bind_<标签,图形,属性>'正在编译
1> ; with
1> [
1> Tag = boost :: vertex_index_t,
1> Graph = boost :: adjacency_list< boost :: listS,boost :: listS,boost :: undirectedS,pintk :: VertexProperties,pintk :: EdgeProperties>,
1> Property = pintk :: VertexProperties
1> ]
1> ... \boost_1_58_0 \boost / graph / detail / adjacency_list.hpp(2752):参见类模板实例化的引用boost :: detail :: adj_list_choose_vertex_pa<标签,图形,属性&''正在编译
1> ; with
1> [
1> Tag = boost :: vertex_index_t,
1> Graph = boost :: adjacency_list< boost :: listS,boost :: listS,boost :: undirectedS,pintk :: VertexProperties,pintk :: EdgeProperties>,
1> Property = pintk :: VertexProperties
1> ]
1> ... \boost_1_58_0 \boost / graph / properties.hpp(208):参见类模板实例化boost :: adj_list_vertex_property_selector :: bind_< Graph,Property,Tag>'正在编译
1& with
1> [
1> Graph = boost :: adjacency_list< boost :: listS,boost :: listS,boost :: undirectedS,pintk :: VertexProperties,pintk :: EdgeProperties>,
1> Property = pintk :: VertexProperties,
1> Tag = boost :: vertex_index_t
1> ]
1> ... \boost_1_58_0 \boost / graph / properties.hpp(217):参见类模板实例化'boost :: detail :: vertex_property_map< Graph,PropertyTag>'被编译
1& with
1> [
1> Graph = boost :: adjacency_list< boost :: listS,boost :: listS,boost :: undirectedS,pintk :: VertexProperties,pintk :: EdgeProperties>,
1> PropertyTag = boost :: vertex_index_t
1> ]
1> ... \boost_1_58_0 \boost / graph / betweenness_centrality.hpp(562):参见类模板实例化'boost :: property_map< Graph,Property,Enable>'正在编译
1& with
1> [
1> Graph = boost :: adjacency_list< boost :: listS,boost :: listS,boost :: undirectedS,pintk :: VertexProperties,pintk :: EdgeProperties>,
1> Property = boost :: vertex_index_t,
1> Enable = void
1> ]
1> ... \Visual Studio 2008 \Projects\yapnl\yapnl\ProteinNetworks.h(82):参见函数模板实例化的参考void boost :: brandes_betweenness_centrality< pintk :: DynamicNet,boost :: iterator_property_map< RandomAccessIterator ,IndexMap>,boost :: iterator_property_map< RandomAccessIterator,EdgeIndexMap>(const Graph&,CentralityMap,EdgeCentralityMap,boost :: graph :: detail :: no_parameter)'
1& with
1> [
1> RandomAccessIterator = std :: _ Vector_iterator< double,std :: allocator< double>>,
1> IndexMap = VertexIndexMap,
1> Graph = pintk :: DynamicNet,
1> CentralityMap = boost :: iterator_property_map< std :: _ Vector_iterator< double,std :: allocator< double>>,VertexIndexMap>,
1> EdgeCentralityMap = boost :: iterator_property_map< std :: _ Vector_iterator< double,std :: allocator< double>>,EdgeIndexMap>
1> ]
1> ... \boost_1_58_0 \boost / graph / detail / adjacency_list.hpp(2544):error C2182:'const_reference':非法使用类型'void'
1>保存在file://...\Visual Studio 2008 \Projects\yapnl\testBetweenness\Release\BuildLog.htm
1> testBetweenness - 2错误,0警告(s)
========== Build:0成功,1失败,0最新,0跳过==========

answer ,帮助我在图定义中添加 boost :: vertex_index_t 属性,该属性允许代码使用 boost :: property< boost :: vertex_index_t,size_t ,VertexProperties>



我想要一种方法来保持 vertex_index_t



设置edge_index的几乎完全相同的代码允许这样做。



我的具体问题是:我需要改变什么?要保持vertex_index超出图形定义,添加它,并仍然运行算法?

解决方案

更新,它看起来像问题是在中间性中心性。挖掘中的调度,然后查看< a href =http://www.boost.org/doc/libs/1_58_0/libs/graph/doc/betweenness_centrality.html> docs 我发现如果 vertex_index_map 没有传递给算法,它默认为 get(vertex_index,g),我们知道在这个特定图形中不存在。



一段时间后,我的头围绕着名为 bgl_named_pa​​rams ,我想我可以通过 v_index 变量作为命名参数。



以下代码实现了以下代码:

  brandes_betweenness_centrality(g,
boost :: centrality_map(v_centrality_map).edge_centrality_map(e_centrality_map).vertex_index_map(v_index));

我认为错误在 brandes_betweenness_centrality 尝试调用 get(vertex_index,g)并在 listS 图表上失败。

Update: The issue may be in the betweenness code. If I comment out the call to brandes_betweenness_centrality the code will compile. the problem may not be the index set up as previously thought. I'll award bounty if you can come up with an alternative call to brandes_betweenness_centrality that will allow keeping the index external.

I'm trying to convert some of my old vecS code to work with listS, specifically the brandes_betweenness_centrality algorithm.

I'm trying to keep the Vertex and Edge properties very light weight and work mainly with external properties. The reason for this is that I don't know what all I'll want to associate with them at this point.

The errors I'm getting are coming from inside adjacency_list.hpp so I figure the problem is with our old friend vertex_index_t with listS.

The following code shows how to reproduce the compile error. In this working example, you can change the definition to stuff a vertex_index into the graph definition and change the set up in the betweenness method for completely working code (which runs betweenness correctly).

The complete example:

#include <iostream>
#include <algorithm>
#include <vector>

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/betweenness_centrality.hpp>

#include <boost/timer.hpp>

using namespace std;

enum edge_t {A,B};

struct VertexProperties{
    std::string id;
};

struct EdgeProperties{
    edge_t type;
};

//vertex_index in as internal property, switch to this graph and change below vertex map for working code
//typedef boost::adjacency_list < boost::listS, boost::listS, boost::undirectedS,
//      boost::property<boost::vertex_index_t,size_t,VertexProperties>, EdgeProperties > DynamicNet;

// No internal vertex_index
typedef boost::adjacency_list < boost::listS, boost::listS, boost::undirectedS,
        VertexProperties, EdgeProperties > DynamicNet;

typedef boost::graph_traits<DynamicNet>::vertex_descriptor DynamicNetVertex;
typedef boost::graph_traits<DynamicNet>::vertex_iterator   DynamicNetVI;

typedef boost::graph_traits<DynamicNet>::edge_descriptor   DynamicNetEdge;
typedef boost::graph_traits<DynamicNet>::edge_iterator     DynamicNetEI;


void calcBetweenness(DynamicNet &g,
                     std::vector<double> &v_centrality_vec,
                     std::vector<double> &e_centrality_vec);


int main(int argc, char* argv[]){
    cout <<  "betweenness" << endl;

    DynamicNet net;

    //Fig. 1, wheen graph (a - h), modified with added z added to a
    //http://www.boost.org/doc/libs/1_58_0/libs/graph/doc/betweenness_centrality.html
    DynamicNetVertex a = boost::add_vertex(net); net[a].id = "a";
    DynamicNetVertex b = boost::add_vertex(net); net[b].id = "b";
    DynamicNetVertex c = boost::add_vertex(net); net[c].id = "c";
    DynamicNetVertex d = boost::add_vertex(net); net[d].id = "d";
    DynamicNetVertex e = boost::add_vertex(net); net[e].id = "e";
    DynamicNetVertex f = boost::add_vertex(net); net[f].id = "f";
    DynamicNetVertex g = boost::add_vertex(net); net[g].id = "g";

    //core
    DynamicNetVertex h = boost::add_vertex(net); net[h].id = "h";

    boost::add_edge(a,h,net); 
    boost::add_edge(b,h,net);
    boost::add_edge(c,h,net);
    boost::add_edge(d,h,net);
    boost::add_edge(e,h,net);
    boost::add_edge(f,h,net);
    boost::add_edge(g,h,net);

    //add an edge to make the calculation more interesting
    DynamicNetVertex z = boost::add_vertex(net); net[z].id = "z";
    boost::add_edge(a,z,net);



    vector<double> v_centrality_vec(boost::num_vertices(net),0.0);
    vector<double> e_centrality_vec(boost::num_edges(net),0.0);

    boost::timer t;
    t.restart();
    calcBetweenness(net,v_centrality_vec,e_centrality_vec);
    double s = t.elapsed();
    cout << s << " s" << endl;
    cout << endl;

    cout << "Vertex betweenness" << endl;
    DynamicNetVI vi,ve;     
    size_t i = 0;
    for(boost::tie(vi,ve) = boost::vertices(net); vi != ve; ++vi){
        cout << net[*vi].id << "\t" << v_centrality_vec.at(i) << endl;
        ++i;
    }

    cout << endl;

    cout << "Edge betweenness" << endl;
    DynamicNetEI ei,ee; 
    i = 0;
    for(boost::tie(ei,ee) = boost::edges(net); ei != ee; ++ei){
        DynamicNetEdge e = *ei;
        cout << net[boost::source(e,net)].id << "\t" 
             << net[boost::target(e,net)].id << "\t" << e_centrality_vec.at(i) << endl;
        ++i;
    }

    cin.get();
}

void calcBetweenness(DynamicNet &g,
                     std::vector<double> &v_centrality_vec,
                     std::vector<double> &e_centrality_vec)
{
    std::cout << "betweenness called" << std::endl;

    //vertex
    //Uncomment and change to internal vertex graph above for working code.

/*
    typedef std::map<DynamicNetVertex,size_t> StdVertexIndexMap;
    StdVertexIndexMap viMap;
    typedef boost::property_map<DynamicNet, boost::vertex_index_t>::type VertexIndexMap;
    VertexIndexMap v_index = boost::get(boost::vertex_index,g);
    DynamicNetVI vi,ve;
    size_t i = 0;
    for(boost::tie(vi,ve) = boost::vertices(g); vi != ve; ++vi){
        boost::put(v_index,*vi,i);
        ++i;
    }
    boost::iterator_property_map< std::vector< double >::iterator, VertexIndexMap >
        v_centrality_map(v_centrality_vec.begin(), v_index);
*/  

    //this code which exactly mimics the working approached used by edge results in an error
    typedef std::map<DynamicNetVertex,size_t> StdVertexIndexMap;
    StdVertexIndexMap viMap;
    typedef boost::associative_property_map<StdVertexIndexMap> VertexIndexMap;
    VertexIndexMap v_index(viMap);
    DynamicNetVI vi,ve;
    size_t i = 0;
    for(boost::tie(vi,ve) = boost::vertices(g); vi != ve; ++vi){
        boost::put(v_index,*vi,i);
        ++i;
    }
    boost::iterator_property_map< std::vector< double >::iterator, VertexIndexMap >
        v_centrality_map(v_centrality_vec.begin(), v_index);



    //edge, this appraoch works fine for edge
    typedef std::map<DynamicNetEdge,size_t> StdEdgeIndexMap;
    StdEdgeIndexMap eiMap;
    typedef boost::associative_property_map<StdEdgeIndexMap> EdgeIndexMap;
    EdgeIndexMap e_index(eiMap);
    DynamicNetEI ei,ee; 
    i = 0;
    for(boost::tie(ei,ee) = boost::edges(g); ei != ee; ++ei){
        boost::put(e_index,*ei,i);
        ++i;
    }
    boost::iterator_property_map< std::vector< double >::iterator, EdgeIndexMap >
        e_centrality_map(e_centrality_vec.begin(), e_index);

    brandes_betweenness_centrality(g,v_centrality_map, e_centrality_map);
}

The error:

Error   1   error C2182: 'reference' : illegal use of type 'void'   ... \boost_1_58_0\boost\graph\detail\adjacency_list.hpp 2543
Error   2   error C2182: 'const_reference' : illegal use of type 'void' ... \boost_1_58_0\boost\graph\detail\adjacency_list.hpp 2544

MSVS output:

1>------ Build started: Project: testBetweenness, Configuration: Release 

Win32 ------
1>Compiling...
1>testBetweenness.cpp
1>...\boost_1_58_0\boost/graph/detail/adjacency_list.hpp(2543) : error C2182: 'reference' : illegal use of type 'void'
1>        ...\boost_1_58_0\boost/graph/detail/adjacency_list.hpp(2619) : see reference to class template instantiation 'boost::adj_list_any_vertex_pa::bind_<Tag,Graph,Property>' being compiled
1>        with
1>        [
1>            Tag=boost::vertex_index_t,
1>            Graph=boost::adjacency_list<boost::listS,boost::listS,boost::undirectedS,pintk::VertexProperties,pintk::EdgeProperties>,
1>            Property=pintk::VertexProperties
1>        ]
1>        ...\boost_1_58_0\boost/graph/detail/adjacency_list.hpp(2752) : see reference to class template instantiation 'boost::detail::adj_list_choose_vertex_pa<Tag,Graph,Property>' being compiled
1>        with
1>        [
1>            Tag=boost::vertex_index_t,
1>            Graph=boost::adjacency_list<boost::listS,boost::listS,boost::undirectedS,pintk::VertexProperties,pintk::EdgeProperties>,
1>            Property=pintk::VertexProperties
1>        ]
1>        ...\boost_1_58_0\boost/graph/properties.hpp(208) : see reference to class template instantiation 'boost::adj_list_vertex_property_selector::bind_<Graph,Property,Tag>' being compiled
1>        with
1>        [
1>            Graph=boost::adjacency_list<boost::listS,boost::listS,boost::undirectedS,pintk::VertexProperties,pintk::EdgeProperties>,
1>            Property=pintk::VertexProperties,
1>            Tag=boost::vertex_index_t
1>        ]
1>        ...\boost_1_58_0\boost/graph/properties.hpp(217) : see reference to class template instantiation 'boost::detail::vertex_property_map<Graph,PropertyTag>' being compiled
1>        with
1>        [
1>            Graph=boost::adjacency_list<boost::listS,boost::listS,boost::undirectedS,pintk::VertexProperties,pintk::EdgeProperties>,
1>            PropertyTag=boost::vertex_index_t
1>        ]
1>        ...\boost_1_58_0\boost/graph/betweenness_centrality.hpp(562) : see reference to class template instantiation 'boost::property_map<Graph,Property,Enable>' being compiled
1>        with
1>        [
1>            Graph=boost::adjacency_list<boost::listS,boost::listS,boost::undirectedS,pintk::VertexProperties,pintk::EdgeProperties>,
1>            Property=boost::vertex_index_t,
1>            Enable=void
1>        ]
1>        ...\Visual Studio 2008\Projects\yapnl\yapnl\ProteinNetworks.h(82) : see reference to function template instantiation 'void boost::brandes_betweenness_centrality<pintk::DynamicNet,boost::iterator_property_map<RandomAccessIterator,IndexMap>,boost::iterator_property_map<RandomAccessIterator,EdgeIndexMap>>(const Graph &,CentralityMap,EdgeCentralityMap,boost::graph::detail::no_parameter)' being compiled
1>        with
1>        [
1>            RandomAccessIterator=std::_Vector_iterator<double,std::allocator<double>>,
1>            IndexMap=VertexIndexMap,
1>            Graph=pintk::DynamicNet,
1>            CentralityMap=boost::iterator_property_map<std::_Vector_iterator<double,std::allocator<double>>,VertexIndexMap>,
1>            EdgeCentralityMap=boost::iterator_property_map<std::_Vector_iterator<double,std::allocator<double>>,EdgeIndexMap>
1>        ]
1>...\boost_1_58_0\boost/graph/detail/adjacency_list.hpp(2544) : error C2182: 'const_reference' : illegal use of type 'void'
1>Build log was saved at "file://...\Visual Studio 2008\Projects\yapnl\testBetweenness\Release\BuildLog.htm"
1>testBetweenness - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

This answer, helped me add boost::vertex_index_t property in the graph definition which allowed the code to run by using boost::property<boost::vertex_index_t,size_t,VertexProperties>.

I would like a way to keep vertex_index_t completely external from the graph and add it just before I run the algorithm.

The virtually identical code for setting up edge_index allows this. Am I missing something or is this an MSVS thing or could it be a bug?

My specific question is: What do I need to change to keep vertex_index out of the graph definition, add it on the fly, and still run the algorithm?

解决方案

As I stated in the update, it looks like the problem was in betweenness centrality. Digging through the dispatches in the source, and looking at the parameters in the docs I found that if vertex_index_map is not passed to the algorithm it defaults to get(vertex_index, g) which as we know does not exist in this particular graph.

After some time wrapping my head around named bgl_named_params, I figured out I could pass the v_index variable as a named parameter.

The following code did the trick:

brandes_betweenness_centrality(g,
            boost::centrality_map(v_centrality_map).edge_centrality_map(e_centrality_map).vertex_index_map(v_index));

I think the error was in the brandes_betweenness_centrality trying to call get(vertex_index,g)and failing on the listS graph.

这篇关于将vertex_index添加到listS图中即时为中间中心的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆