首页 文章

如何访问boost子图'graph'属性?

提问于
浏览
3

我使用adjacency_list和子图适配器来创建我的图表类型 .

#include <boost/graph/subgraph.hpp>
#include <boost/graph/adjacency_list.hpp>

struct VertexProperties
{
    bool bIsExpandable;          
    string sId;
    string sCoord_X;
    string sCoord_Y;
    std::size_t order;
};

struct EdgeProperties
{
    string sId;
    bool bBidirectional;
};

//Graph properties
enum graph_index_t {graph_index=111};
namespace boost{
BOOST_INSTALL_PROPERTY(graph,index);
}

typedef boost::property<boost::vertex_index_t, std::size_t , VertexProperties> vertex_prop;
typedef boost::property<boost::edge_index_t, std::size_t , EdgeProperties> edge_prop;
typedef boost::property<graph_index_t, std::size_t> graph_prop;

typedef boost::adjacency_list<
boost::listS,
boost::vecS,
boost::bidirectionalS,
vertex_prop ,
edge_prop,
graph_prop>
Graph;

typedef boost::subgraph<Graph> Subgraph;

我正在使用顶点和边的捆绑属性 . 我已经尝试将捆绑属性提供给'graph',对于adjacency_list它工作正常但不能用于子图适配器,我发现它不受boost子图适配器的支持 . 所以我将graph_index_t添加到图表属性中,但我无法访问它 . 我已经编写了以下属性映射来访问它,但似乎它不是正确的方法 .

typedef property_map<Subgraph , graph_index_t>::type GraphIndexPropertyMap;

它在adjacency_list.hpp中给出错误

d:\boost_1_53_0\boost\graph\detail\adjacency_list.hpp:2543: error: forming reference to void

我检查了boost 1.53文档,但找不到与此相关的方法 .

所以我有两个问题:

1)如何获得graph_index属性的读写权限?

2)我可以以某种方式使用带有boost子图的'graph'的捆绑属性吗?

有人可以帮忙吗?

谢谢,

PRATIK

1 回答

  • 0

    以下是您的问题的解决方案,它使用捆绑属性和动态属性来考虑boost子图中的访问方法,如下所示:

    #include <QtCore/QCoreApplication>
    
    #include <boost/config.hpp>
    #include <iostream>
    #include <algorithm>
    #include <boost/graph/adjacency_list.hpp>
    #include <boost/property_map/property_map.hpp>
    #include <string>
    #include <boost/graph/subgraph.hpp>
    #include <QMap>
    
    using namespace std;
    using namespace boost;
    
    enum graph_IDproperty_t
    {
       graph_IDproperty
    };
    namespace boost
    {
      BOOST_INSTALL_PROPERTY(graph,IDproperty);
    }
    struct GraphProperties {
     std::string strName;
    std::string id;
    };
    
    typedef boost::subgraph<boost::adjacency_list< boost::listS,
    boost::vecS,
    boost::bidirectionalS,
    boost::property<boost::vertex_index_t, int , property<boost::vertex_color_t,   boost::default_color_type > > ,
    
    boost::property<boost::edge_index_t,int, property<boost::edge_color_t , default_color_type> > ,
    
    boost::property<graph_IDproperty_t,GraphProperties > > >
    Graph;
    
    Graph gMainGraph;
    
    typedef QMap<Graph*,GraphProperties*> mapGraphToProperty;
    mapGraphToProperty getMap(Graph& graph);
    void graphMapRecur(mapGraphToProperty& map, Graph& graph);
    
    int main(int argc, char *argv[])
    {
       QCoreApplication a(argc, argv);
    
    Graph& subG = gMainGraph.create_subgraph();
    Graph& subG1 = gMainGraph.create_subgraph();
    
    boost::ref_property_map<Graph*, GraphProperties>
            graph_propt1(boost::get_property(subG1,graph_IDproperty));
    
    graph_propt1[&subG1].id = "SubG1";
    cout<<graph_propt1[&subG1].id<<endl;
    
    boost::ref_property_map<Graph*, GraphProperties>
            graph_propt(boost::get_property(subG,graph_IDproperty));
    
    graph_propt[&subG].id = "SubG";
    cout<<graph_propt[&subG].id<<endl;
    
    boost::ref_property_map<Graph*, GraphProperties>
            graph_proptMain(boost::get_property(gMainGraph,graph_IDproperty));
    
    graph_proptMain[&gMainGraph].id = "gMain";
    cout<<graph_proptMain[&gMainGraph].id<<endl;
    
    mapGraphToProperty map = getMap(gMainGraph);
    
    boost::ref_property_map<Graph*, GraphProperties>
            graph_proptMain1(*(map.value(&gMainGraph)));
    
    boost::ref_property_map<Graph*, GraphProperties>
            graph_proptsubG(*(map.value(&subG)));
    
    boost::ref_property_map<Graph*, GraphProperties>
            graph_proptsubG1(*(map.value(&subG1)));
    
    cout<<"Main G Value : "<<graph_proptMain1[&gMainGraph].id<<endl;
    cout<<"Sub G Value : "<<graph_proptsubG[&subG].id<<endl;
    cout<<"Sub G1 Value : "<<graph_proptsubG1[&subG1].id<<endl;
    
    
    cout<<"Map Value Main: "<<(map.value(&gMainGraph))<<endl;
    cout<<"Map Value SubG: "<<(map.value(&subG))<<endl;
    cout<<"Map Value SubG1b: "<<(map.value(&subG1))<<endl;
    return a.exec();
    }
    mapGraphToProperty getMap(Graph &graph)
    {
    mapGraphToProperty map;
    graphMapRecur(map,graph);
    return map;
    }
    
    void graphMapRecur(mapGraphToProperty &map, Graph &graph)
    {
    Graph::children_iterator itrSubgraph, itrSubgraph_end;
    
    for (boost::tie(itrSubgraph, itrSubgraph_end) = (graph).children(); itrSubgraph != itrSubgraph_end; ++itrSubgraph)
    {
        graphMapRecur(map,(*itrSubgraph));
    }
    
    GraphProperties* gp = &(get_property(graph,graph_IDproperty));
    
    map.insert(&graph,gp);
    cout<<"Recurrr"<<endl;
    
    }
    

相关问题