如何输出一个有向图在graphml格式

How to output a directed graph in graphml format?

本文关键字:有向图 graphml 格式 一个 何输出 输出      更新时间:2023-10-16

如何将下面的图形输出到graphml中?

typedef struct Vertex{ std::string name; std::string cmdb_id;
             Vertex& operator= (const Vertex& rhs)
             {
                     if (this == &rhs)
                             return *this;
                     name = rhs.name;
                     cmdb_id = rhs.cmdb_id;
             }
             bool operator< (const Vertex& rhs) const
             {
                     return cmdb_id < rhs.cmdb_id;
             };
             bool operator== (const Vertex& rhs) const
             {
                     return ((cmdb_id == rhs.cmdb_id) && (name == rhs.name));
             };
     }vertex_container;
typedef struct Edge {std::string name;} edge_container;
boost::directed_graph<vertex_container, edge_container> Graph g;

这是另一个不使用c++11特性的版本:

#include <iostream>
#include <boost/graph/directed_graph.hpp>
#include <boost/graph/graphml.hpp>

typedef struct Vertex
{ 
   std::string name; 
   std::string cmdb_id;
   Vertex& operator= (const Vertex& rhs)
   {
      if (this == &rhs)
        return *this;
      name = rhs.name;
      cmdb_id = rhs.cmdb_id;
   }
   bool operator< (const Vertex& rhs) const
   {
      return cmdb_id < rhs.cmdb_id;
   };
   bool operator== (const Vertex& rhs) const
   {
      return ((cmdb_id == rhs.cmdb_id) && (name == rhs.name));
   };
}vertex_container;
typedef struct Edge {std::string name;} edge_container;
typedef boost::directed_graph<vertex_container, edge_container> Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor vertex_descriptor;
int main()
{
   Graph g;
   vertex_container A, B;
   edge_container AB;
   A.name="A";
   A.cmdb_id="1";
   B.name="B";
   B.cmdb_id="2";
   AB.name="A-B";
   vertex_descriptor v0 = g.add_vertex(A);
   vertex_descriptor v1 = g.add_vertex(B);
   g.add_edge(v0,v1,AB);
   boost::dynamic_properties dp;
   dp.property("vertex_name",get(&vertex_container::name,g));
   dp.property("vertex_cmdb_id",get(&vertex_container::cmdb_id,g));
   dp.property("edge_name",get(&edge_container::name,g));
   write_graphml(std::cout, g, dp);
}
#include <iostream>
#include <boost/graph/directed_graph.hpp>
#include <boost/graph/graphml.hpp>

typedef struct Vertex
{ 
   std::string name; 
   std::string cmdb_id;
   Vertex& operator= (const Vertex& rhs)
   {
      if (this == &rhs)
        return *this;
      name = rhs.name;
      cmdb_id = rhs.cmdb_id;
   }
   bool operator< (const Vertex& rhs) const
   {
      return cmdb_id < rhs.cmdb_id;
   };
   bool operator== (const Vertex& rhs) const
   {
      return ((cmdb_id == rhs.cmdb_id) && (name == rhs.name));
   };
}vertex_container;
typedef struct Edge {std::string name;} edge_container;
typedef boost::directed_graph<vertex_container, edge_container> Graph;
int main()
{
   Graph g;
   auto v0 = g.add_vertex({"A","1"});
   auto v1 = g.add_vertex({"B","2"});
   g.add_edge(v0,v1,{"A-B"});
   boost::dynamic_properties dp;
   dp.property("vertex_name",get(&vertex_container::name,g));
   dp.property("vertex_cmdb_id",get(&vertex_container::cmdb_id,g));
   dp.property("edge_name",get(&edge_container::name,g));
   write_graphml(std::cout, g, dp);
}