breadth_first_search 在 labeled_graph
breadth_first_search on labeled_graph
假设以下设置,应该如何使用 labeled_graph 调用 breadth_first_search? - 导致 2 个错误:
二进制“[”: 未找到接受 'Vertex' 类型右手操作数的运算符(或没有可接受的转换)
'.id' 左边的错误 2 必须有 class/struct/union
#include<iostream>
#include<boost/graph/adjacency_list.hpp>
#include<boost/graph/breadth_first_search.hpp>
#include <boost/graph/labeled_graph.hpp>
using namespace boost;
struct NodeInfo{int id;};
struct EdgeInfo{};
typedef boost::labeled_graph< boost::adjacency_list<
boost::vecS, boost::vecS, boost::undirectedS, NodeInfo, EdgeInfo>,
std::string> Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor GridVertex;
class Topology
{
public:
Graph grid;
std::map<std::string, GridVertex> vertices; //_id to Edge
struct custom_visitor : public boost::default_bfs_visitor
{
Graph& grid;
custom_visitor(Graph& grid) :grid(grid) {}
template <typename Vertex, typename Graph>
void discover_vertex(Vertex v, const Graph& g)
{
//vertex(...) in breadth_first_search is causing:
//binary '[' : no operator found which takes a right-hand operand of
//type 'Vertex' (or there is no acceptable conversion)
//left of .id must have class...
int m = grid[v].id;
}
};
void GetShortestPath(std::string s_id, std::string t_id)
{
custom_visitor vis(grid);
//vertex(...) causes error
breadth_first_search(grid.graph(), vertex(vertices[s_id],grid.graph()), visitor(vis));
}
void BuildNet()
{
Graph g;
GridVertex v;
v = add_vertex("A", NodeInfo(), g);
vertices["A"] = v;
v = add_vertex("B", NodeInfo(), g);
vertices["B"] = v;
add_edge_by_label("A", "B", EdgeInfo(), g);
}
};
int main()
{
Topology net;
net.GetShortestPath("A", "B");
return 0;
}
为什么要使用 labeled_graph?
带标签的图表与 只是 adjacency_list 有不同的界面。这并不奇怪,因为否则还有什么意义:)
所以,如果 vertex(...) causes error
使用 grid.vertex(s_id)
:
breadth_first_search(grid.graph(), grid.vertex(s_id), visitor(vis));
在访问者中,使用实际图表,以便您可以使用其 operator[]
:
int m = grid.graph()[v].id;
或者,实际上为什么不使用第二个参数,目的是:
void discover_vertex(Vertex v, const Graph& g) {
int m = g[v].id;
}
努力从代码中做出一个合理的例子:Live On Coliru
假设以下设置,应该如何使用 labeled_graph 调用 breadth_first_search? - 导致 2 个错误:
二进制“[”: 未找到接受 'Vertex' 类型右手操作数的运算符(或没有可接受的转换)
'.id' 左边的错误 2 必须有 class/struct/union
#include<iostream>
#include<boost/graph/adjacency_list.hpp>
#include<boost/graph/breadth_first_search.hpp>
#include <boost/graph/labeled_graph.hpp>
using namespace boost;
struct NodeInfo{int id;};
struct EdgeInfo{};
typedef boost::labeled_graph< boost::adjacency_list<
boost::vecS, boost::vecS, boost::undirectedS, NodeInfo, EdgeInfo>,
std::string> Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor GridVertex;
class Topology
{
public:
Graph grid;
std::map<std::string, GridVertex> vertices; //_id to Edge
struct custom_visitor : public boost::default_bfs_visitor
{
Graph& grid;
custom_visitor(Graph& grid) :grid(grid) {}
template <typename Vertex, typename Graph>
void discover_vertex(Vertex v, const Graph& g)
{
//vertex(...) in breadth_first_search is causing:
//binary '[' : no operator found which takes a right-hand operand of
//type 'Vertex' (or there is no acceptable conversion)
//left of .id must have class...
int m = grid[v].id;
}
};
void GetShortestPath(std::string s_id, std::string t_id)
{
custom_visitor vis(grid);
//vertex(...) causes error
breadth_first_search(grid.graph(), vertex(vertices[s_id],grid.graph()), visitor(vis));
}
void BuildNet()
{
Graph g;
GridVertex v;
v = add_vertex("A", NodeInfo(), g);
vertices["A"] = v;
v = add_vertex("B", NodeInfo(), g);
vertices["B"] = v;
add_edge_by_label("A", "B", EdgeInfo(), g);
}
};
int main()
{
Topology net;
net.GetShortestPath("A", "B");
return 0;
}
为什么要使用 labeled_graph?
带标签的图表与 只是 adjacency_list 有不同的界面。这并不奇怪,因为否则还有什么意义:)
所以,如果 vertex(...) causes error
使用 grid.vertex(s_id)
:
breadth_first_search(grid.graph(), grid.vertex(s_id), visitor(vis));
在访问者中,使用实际图表,以便您可以使用其 operator[]
:
int m = grid.graph()[v].id;
或者,实际上为什么不使用第二个参数,目的是:
void discover_vertex(Vertex v, const Graph& g) {
int m = g[v].id;
}
努力从代码中做出一个合理的例子:Live On Coliru