Как установить и получить свойство графика из библиотеки графов повышения?

Я не знаю, как установить и получить graph_name как свойство из графика adjacency_list. Я могу поставить и получить свойства вершин и ребер.

Любая помощь будет оценена по достоинству.


person user3513141    schedule 09.04.2014    source источник


Ответы (2)


Прежде всего, нужно определить классы для хранения свойств вершин, ребер и графов.

class cVertexProps {
...
}
class cEdgeProps {
...
}
class cGraphProps {
public:
    std::string myName;
    ...
};

Теперь определите свой график

typedef boost::adjacency_list <
    boost::vecS, boost::vecS, boost::undirectedS,
    cVertexProps, cEdgeProps, cGraphProps  >
            graph_t;
graph_t myGraph;

... и так установите имя вашего графика

myGraph[graph_bundle].myName= "My First Graph";

При этом используются «связанные свойства», которые описаны здесь: http://www.boost.org/doc/libs/1_55_0/libs/graph/doc/bundles.html

person ravenspoint    schedule 09.04.2014

У меня есть решение для подграфа повышения (просто попробуйте его для графа, оно точно сработает), свойство получает и устанавливает, как показано ниже: -

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

}
person Mayur    schedule 21.05.2014
comment
Предложите добавить некоторые комментарии, чтобы объяснить, что вы делаете. - person UpAndAdam; 21.05.2014