- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Boost BGL C++,我需要图形来执行从源顶点到目标顶点的 BFS 并返回所有唯一路径。
现在,我想到了一种使用过滤图来获取包含从源到目标路径的图的子集的方法,但我意识到这基本上不是过滤,因为过滤图包含被访问但不包含的顶点从源到目标的路径。有没有什么方法可以获取此信息或其他方法更好?
引用代码:
boost::filtered_graph<DirectedGraph, boost::keep_all, std::function<bool(VertexDescr)>> Graph::getUniquePathsFromSource(VertexDescr source, VertexDescr target, DirectedGraph const & g)
{
std::vector<double> distances(num_vertices(g));
std::vector<boost::default_color_type> colormap(num_vertices(g));
// Run BFS and record all distances from the source node
breadth_first_search(g, source,
visitor(make_bfs_visitor(boost::record_distances(distances.data(), boost::on_tree_edge())))
.color_map(colormap.data())
);
for (auto vd : boost::make_iterator_range(vertices(g)))
if (colormap.at(vd) == boost::default_color_type{})
distances.at(vd) = -1;
distances[source] = -2;
boost::filtered_graph<DirectedGraph, boost::keep_all, std::function<bool(VertexDescr)>>
fg(g, {}, [&](VertexDescr vd) { return distances[vd] != -1; });
// Print edge list
std::cout << "filtered out-edges:" << std::endl;
std::cout << "Source Vertex: " << source << std::endl;
auto ei = boost::edges(fg);
typedef boost::property_map<DirectedGraph, boost::edge_weight_t>::type WeightMap;
WeightMap weights = get(boost::edge_weight, fg);
for (auto it = ei.first; it != ei.second; ++it)
{
if (source != boost::target(*it, g)) {
std::cout << "Edge Probability " << *it << ": " << get(weights, *it) << std::endl;
}
}
return fg;
}
输入(顶点1、顶点2、权重):
0 1 0.001
0 2 0.1
0 3 0.001
1 5 0.001
2 3 0.001
3 4 0.1
1 482 0.1
482 635 0.001
4 705 0.1
705 5 0.1
1 1491 0.01
1 1727 0.01
1 1765 0.01
输出(源 = 0,目标 = 5):
Source Vertex: 0
Edge Probability (0,1): 0.001
Edge Probability (0,2): 0.1
Edge Probability (0,3): 0.001
Edge Probability (1,5): 0.001
Edge Probability (1,482): 0.1
Edge Probability (1,1491): 0.01
Edge Probability (1,1727): 0.01
Edge Probability (1,1765): 0.01
Edge Probability (2,3): 0.001
Edge Probability (3,4): 0.1
Edge Probability (4,705): 0.1
Edge Probability (482,635): 0.001
Edge Probability (705,5): 0.1
预期输出:
0->1->5
0->3->4->705->5
0->2->3->4->705->5
最佳答案
我不会使用 BFS 算法,因为它使用颜色图来跟踪访问过的节点。但是,如果您想要所有 不同的路径,您将不想跳过已经访问过的节点(因为您可能会跳过其他路径)。
相反,我将实现一种强力广度优先递归算法,该算法只访问所有相邻节点除非它们已经在当前路径中。
所有需要的状态都是当前路径。
这个想法在这里有更详细的解释:https://www.quora.com/How-should-I-find-all-distinct-simple-paths-between-2-given-nodes-in-an-undirected-graph
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_utility.hpp> // print_graph
using namespace boost;
using Graph = adjacency_list<vecS, listS, directedS, property<vertex_index_t, int>, property<edge_weight_t, double> >;
Graph read_graph();
using Vertex = Graph::vertex_descriptor;
using Path = std::vector<Vertex>;
template <typename Report>
void all_paths_helper(Vertex from, Vertex to, Graph const& g, Path& path, Report const& callback) {
path.push_back(from);
if (from == to) {
callback(path);
} else {
for (auto out : make_iterator_range(out_edges(from, g))) {
auto v = target(out, g);
if (path.end() == std::find(path.begin(), path.end(), v)) {
all_paths_helper(v, to, g, path, callback);
}
}
}
path.pop_back();
}
template <typename Report>
void all_paths(Vertex from, Vertex to, Graph const& g, Report const& callback) {
Path state;
all_paths_helper(from, to, g, state, callback);
}
int main() {
auto g = read_graph();
print_graph(g, std::cout);
auto by_vertex_id = [&](int id) {
return *find_if(vertices(g), [&](Vertex vd) { return id == get(vertex_index, g, vd); });
};
all_paths(by_vertex_id(0), by_vertex_id(5), g, [&](Path const& path) {
std::cout << "Found path ";
for (auto v : path)
std::cout << get(vertex_index, g, v) << " ";
std::cout << "\n";
});
std::cout.flush();
}
// immaterial to the task, reading the graph
Graph read_graph() {
std::istringstream iss(R"(
0 1 0.001
0 2 0.1
0 3 0.001
1 5 0.001
2 3 0.001
3 4 0.1
1 482 0.1
482 635 0.001
4 705 0.1
705 5 0.1
1 1491 0.01
1 1727 0.01
1 1765 0.01)");
Graph g;
auto vertex = [&,idx=std::map<int,Vertex>{}](int id) mutable {
auto it = idx.find(id);
if (it != idx.end())
return it->second;
return idx.emplace(id, add_vertex(id, g)).first->second;
};
for (std::string line; getline(iss, line);) {
std::istringstream ls(line);
int s,t; double w;
if (ls >> s >> t >> w) {
add_edge(vertex(s), vertex(t), w, g);
} else {
std::cerr << "Skipped invalid line '" << line << "'\n";
}
}
return g;
}
打印:
1 --> 5 482 1491 1727 1765
0 --> 1 2 3
2 --> 3
3 --> 4
5 -->
4 --> 705
482 --> 635
635 -->
705 --> 5
1491 -->
1727 -->
1765 -->
Found path 0 1 5
Found path 0 2 3 4 705 5
Found path 0 3 4 705 5
关于c++ - Boost BGL BFS 找到从源到目标的所有唯一路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46966933/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!