2016-06-03 4 views
0

내가 boost.I가 중복 질문부스트

#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/graphviz.hpp> 
struct my_graph_writer { 
    void operator()(std::ostream& out) const { 
     out << "graph [bgcolor=lightgrey]" << std::endl; 
     out << "node [shape=circle color=blue]" << std::endl; 
     out << "edge [color=red]" << std::endl; 
    } 
} myGraphWrite; 
int main() 
{ 
    using namespace boost; 
    typedef adjacency_list<vecS, vecS, directedS, no_property, int> Graph; 
    Graph g; 
    add_edge(0, 1, 123, g); 
    std::ofstream gout; 
    gout.open("graphname.dot"); 
    write_graphviz(gout,g,my_graph_writer); 
} 
에 대한 노드와 edge.i'm 점점 컴파일 error.sorry의 속성을 변경하려면 사용하여 그래프를 만들려고을 사용하여 그래프의 노드를 색칠하는 방법

다음과 같이 수정되었습니다.하지만 주먹 노드가 변경되지 않습니다. 문제가 있습니까?

#include <iostream> 
#include <boost/graph/graphviz.hpp> 
using namespace boost; 

typedef adjacency_list< listS, vecS, directedS > digraph; 

// define a property writer to color the edges as required 
class color_writer { 
public: 
     // constructor - needs reference to graph we are coloring 
    color_writer(digraph& g) : myGraph(g) {} 
     // functor that does the coloring 

    template <class VertexOrEdge> 
    void operator()(std::ostream& out, const VertexOrEdge& e) const { 

     out << "graph [bgcolor=lightgrey]" << std::endl; 
     out << "node [shape=Mrect color=blue]" << std::endl; 
     out << "edge [color=red]" << std::endl; 
    } 
private: 
    digraph& myGraph; 
}; 

int main() 
{ 
    using namespace std; 

    // instantiate a digraph object with 8 vertices 
    digraph g; 

    // add some edges 
    add_edge(0, 1, g); 
    add_edge(1, 5, g); 
    add_edge(5, 6, g); 
    add_edge(2, 3, g); 
    add_edge(2, 4, g); 
    boost::write_graphviz(f, g,color_writer(g)); 
    return 0; 
} 

답변

1

here을 볼 수있는 바와 같이, 세 개의 매개 변수를 사용하여 write_graphviz 과부하는 (원래했다으로) 다섯 가지 매개 변수 오버로드를 사용할 필요가 있으므로 그 세 번째 매개 변수가하는 VertexPropertyWriter이 될 것으로 기대하고있다. 당신은이 문제가

#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/graphviz.hpp> 
using std::map; 
struct my_node_writer { 
    // my_node_writer() {} 
    my_node_writer(Map& g_) : g (g_) {}; 
    template <class Vertex> 
    void operator()(std::ostream& out, Vertex v) { 
     out << " [label=\"" << v << "\"]" << std::endl; 
    }; 
    Map g; 
}; 

struct my_edge_writer { 
    my_edge_writer(Map& g_) : g (g_) {}; 
    template <class Edge> 
    void operator()(std::ostream& out, Edge e) { 

     out << " [color=purple]" << std::endl; 
     out << " [label=\"" << e <<":" << g[e].miles << "\"]" << std::endl; 
    }; 
    Map g; 
}; 

struct my_graph_writer { 
    void operator()(std::ostream& out) const { 
     out << "graph [bgcolor=lightgrey]" << std::endl; 
     out << "node [shape=circle color=blue]" << std::endl; 

     out << "edge [color=red]" << std::endl; 
    } 
} myGraphWrite; 

int main() 
{ 
    using namespace boost; 
    typedef adjacency_list<vecS, vecS, directedS, no_property, int> Graph; 
    Graph g; 
    add_edge(0, 1, 123, g); 
    std::ofstream gout; 
    gout.open("graphname.dot"); 
    write_graphviz(gout,map,my_node_writer(map),my_edge_writer(map),myGraphWrite); 

} 

: 이것은 당신의 접근 방식이었다 정의 Map 아무것도 참조하지 않는 한 당신이 당신의 그래프 g[e].miles을 사용할 수 없습니다.

첫 번째 문제를 해결하려면 miles이라는 member_variable을 사용하여 구조체를 만들고 그래프 정의에서 EdgeProperty으로 사용해야합니다. Map 문제를 해결하는 가장 쉬운 방법은 속성 작성자 앞에 그래프를 정의한 다음 Map 대신 Graph을 사용할 수도 있지만 구조를 필요로하는 곳의 구조체 매개 변수로 만드는 것입니다. 이러한 변경 사항 :

Running on Coliru :

#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/graphviz.hpp> 
using std::map; 

template <typename Map> 
struct my_node_writer { 
    // my_node_writer() {} 
    my_node_writer(Map& g_) : g (g_) {}; 
    template <class Vertex> 
    void operator()(std::ostream& out, Vertex v) { 
     out << " [label=\"" << v << "\"]" << std::endl; 
    }; 
    Map g; 
}; 

template <typename Map> 
my_node_writer<Map> node_writer(Map& map) { return my_node_writer<Map>(map); } 

template <typename Map> 
struct my_edge_writer { 
    my_edge_writer(Map& g_) : g (g_) {}; 
    template <class Edge> 
    void operator()(std::ostream& out, Edge e) { 

     out << " [color=purple]" << std::endl; 
     out << " [label=\"" << e <<":" << g[e].miles << "\"]" << std::endl; 
    }; 
    Map g; 
}; 

template <typename Map> 
my_edge_writer<Map> edge_writer(Map& map) { return my_edge_writer<Map>(map); } 

struct my_graph_writer { 
    void operator()(std::ostream& out) const { 
     out << "graph [bgcolor=lightgrey]" << std::endl; 
     out << "node [shape=circle color=blue]" << std::endl; 

     out << "edge [color=red]" << std::endl; 
    } 
} myGraphWrite; 

struct edge_prop 
{ 
    int miles; 
}; 

int main() 
{ 
    using namespace boost; 
    typedef adjacency_list<vecS, vecS, directedS, no_property, edge_prop> Graph; 
    Graph g; 
    add_edge(0, 1, edge_prop{123}, g); 

    write_graphviz(std::cout,g,node_writer(g),edge_writer(g),myGraphWrite); 

} 
+0

내가 above.but 주먹 노드로 수정이 뭐야가 문제가 변경되지 –

+0

도 방문 정점의 색상을 변경하는 방법? –

관련 문제