gpt4 book ai didi

c++ - boost bgl write_graphviz VertexPropertyWriter 和 EdgePropertyWriter

转载 作者:行者123 更新时间:2023-11-30 02:41:01 24 4
gpt4 key购买 nike

您好,以下代码中的任何一处,make_edge_writer 函数无法在 gcc4.9 中推断类型。我的代码基于此处找到的以下答案 How to print a graph in graphviz with multiple properties displayed .

#include <boost/graph/graphviz.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <string>
#include <tuple>
#include <iostream>
#include <iomanip>
#include <map>
#include <random>
#include <cmath>
#include <fstream>
#include <utility>
#include <boost/graph/iteration_macros.hpp>
#include <boost/graph/graph_utility.hpp>
using namespace boost;

struct vert{
std::string name;
};

struct edge{
int capacity;
int weight;
};

template <class WeightMap,class CapacityMap>
class edge_writer
{
public:
edge_writer(WeightMap w, CapacityMap c) : wm(w),cm(c) {}

template <class Edge>
void operator()(ostream &out, const Edge& e) const {
out << "[label=\"" << wm[e] << "\", taillabel=\"" << cm[e] << "\"]";
}
private:
WeightMap wm;
CapacityMap cm;
};

template <class WeightMap, class CapacityMap>
inline edge_writer<WeightMap,CapacityMap>
make_edge_writer(WeightMap w,CapacityMap c)
{
return edge_writer<WeightMap,CapacityMap>(w,c);
}

int main(int a,char **b)
{
typedef adjacency_list<listS, vecS, undirectedS, vert, edge> Graph;
Graph g;
vector<int,int> ele;
edge prop;
prop.weight = 5;
prop.capacity = 4;
add_edge(ele.first,ele.second, prop, g);
std::random_device rd;
// Choose a random mean between 1 and 100
std::default_random_engine e1(rd());
std::uniform_int_distribution<int> uniform_dist(1, 100);
for (int a=0;a<20;++a){
edge prop1;
prop1.weight = uniform_dist(e1);
prop1.capacity = uniform_dist(e1);
add_edge(ele.first,ele.second, prop1, g);
}
std::ofstream dot("graph.dot");
write_graphviz(
dot,
g,
boost::make_label_writer(
boost::get(&vert::name, g)
),
make_edge_writer(
boost::get(&edge::weight,g),
boost::get(&edge::capacity,g)
)
);
}

最佳答案

您遇到了评论中提到的语法问题,并且将所有具有相同未初始化源和目标的边从 ele 插入(应该是 std::pair<int, int> ?)。

生成随机图...最简单的方法

如果您想生成随机图,可以使用 boost::generate_random_graph :

int main() {
typedef b::adjacency_list<b::listS, b::vecS, b::undirectedS, vert, edge> Graph;
Graph g;

b::generate_random_graph(g, 10 /*100*/, 5 /*20*/, rng);

std::ofstream dot("graph.dot");
write_graphviz(dot, g, boost::make_label_writer(boost::get(&vert::name, g)),
make_edge_writer(boost::get(&edge::weight, g), boost::get(&edge::capacity, g)));
}

为简单起见,我使用类内初始化程序来生成随机权重/容量:

struct edge {
int capacity = uniform_dist(rng);
int weight = uniform_dist(rng);
};

查看 Live On Coliru

例如enter image description here

enter image description here

关于c++ - boost bgl write_graphviz VertexPropertyWriter 和 EdgePropertyWriter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28522967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com