0

ブースト 1.53.0 を使用しています。サブグラフにブーストを使用して小さなデモを実装しました。サブグラフ情報をgraphmlファイルにエクスポートする必要がありますが、エクスポートすると親グラフにすべてのノードが作成されますが、サブグラフに関する情報を保持できません。サブグラフに関する情報を保持する方法があれば、私を助けてください。私の実装は次のようにエクスポートしています:

enter code here

<?xml version="1.0" encoding="UTF-8"?>

<graphml xmlns="http://graphml.graphdrawing.org/xmlns" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns 
http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">

<graph id="G" edgedefault="undirected" parse.nodeids="free" 
parse.edgeids="canonical" parse.order="nodesfirst">

<node id="n0">

</node>

<node id="n1">

    </node>

<node id="n2">

</node>

<node id="n3">

</node>

<node id="n4">

</node>

<node id="n5">

</node>

<edge id="e0" source="n0" target="n1">

</edge>

<edge id="e1" source="n1" target="n2">

</edge>

<edge id="e2" source="n1" target="n3">

</edge>

<edge id="e3" source="n4" target="n1">

</edge>

<edge id="e4" source="n4" target="n5">

</edge>

<edge id="e5" source="n5" target="n3">    

</edge>    

<edge id="e6" source="n2" target="n5">    

</edge>    

</graph>    

 </graphml>   

実際には、ノード n0、n1、n2 はサブグラフ G1 のメンバーであり、n4、n5 はサブグラフ G2 のメンバーです。G0 はメインの親グラフです。

4

1 に答える 1

0

以下は、上記の問題に対処する方法です。この問題は、boost の動的プロパティの使用と、boost のバンドルされたプロパティの使用を組み合わせることで解決されます。このコードはブースト 1_53_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;
}
于 2014-05-21T13:07:14.430 に答える