2013-10-14 32 views
2

我正在使用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; 

我正在使用頂點和邊的捆綁屬性。我試圖給捆綁的屬性'圖',爲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 

我已籤提升1.53文檔,但無法找到與此相關的方式錯誤。

所以我有2個問題:

1)如何獲得讀寫到graph_index屬性訪問?

2)我可以以某種方式使用帶有子圖的'圖'的捆綁屬性嗎?

任何人都可以幫忙嗎?

感謝,

PRATIK

回答

0

這裏是你的問題,使用捆綁性和動態性能如下它參考訪問方法增強子的解決方案:

#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; 

}