- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 boost dijkstra 算法在图中找到最短路径。
std::pair<c_vertex_iterator_t, c_vertex_iterator_t> vi;
std::pair<c_vertex_iterator_t, c_vertex_iterator_t> vj;
boost::property_map<ConGraph,boost::edge_weight_t>::type weightmap = get(boost::edge_weight, cg);
std::vector<c_vertex_t> p(num_vertices(cg));
std::vector<int> d(num_vertices(cg));
for (vi = vertices(cg); vi.first != vi.second; ++vi.first)
{
boost::dijkstra_shortest_paths(cg, *vi.first,
predecessor_map(boost::make_iterator_property_map(p.begin(), get(boost::vertex_index, cg))).
distance_map(boost::make_iterator_property_map(d.begin(), get(boost::vertex_index, cg))));
for (vj = vertices(cg); vj.first != vj.second; ++vj.first)
{
distMat[*vi.first][*vj.first]= d[*vj.first];
}
}
return boost::num_vertices(cg);
但是我在这段代码中遇到了问题;应用程序在此行停止运行:
distance_map(boost::make_iterator_property_map(d.begin(), get(boost::vertex_index, cg))));
visual c++ 检测到由该指令引起的损坏的内存段错误
retval = HeapFree(_crtheap, 0, pBlock);
我应该怎么做才能解决这个问题?
最佳答案
我支持 @1201ProgramAlarm:为 distMat
安全分配内存表明代码几乎没有真正的问题:
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/dag_shortest_paths.hpp>
using ConGraph = boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,
boost::no_property, boost::property<boost::edge_weight_t, int> >;
using c_vertex_iterator_t = ConGraph::vertex_iterator;
using c_vertex_t = ConGraph::vertex_descriptor;
template <typename Matrix>
int foo(ConGraph& cg, Matrix& distMat) {
std::pair<c_vertex_iterator_t, c_vertex_iterator_t> vi;
std::pair<c_vertex_iterator_t, c_vertex_iterator_t> vj;
boost::property_map<ConGraph,boost::edge_weight_t>::type weightmap = get(boost::edge_weight, cg);
std::vector<c_vertex_t> p(num_vertices(cg));
std::vector<int> d(num_vertices(cg));
for (vi = vertices(cg); vi.first != vi.second; ++vi.first)
{
boost::dijkstra_shortest_paths(cg, *vi.first,
predecessor_map(boost::make_iterator_property_map(p.begin(), get(boost::vertex_index, cg))).
distance_map(boost::make_iterator_property_map(d.begin(), get(boost::vertex_index, cg))).
weight_map(weightmap)
);
for (vj = vertices(cg); vj.first != vj.second; ++vj.first) {
distMat[*vi.first][*vj.first] = d[*vj.first];
}
}
return boost::num_vertices(cg);
}
#include <boost/graph/graph_utility.hpp>
#include <boost/graph/random.hpp>
#include <iomanip>
#include <random>
int main() {
ConGraph g;
{
std::mt19937 rng { std::random_device{}() };
std::uniform_int_distribution<int> wdist(1,10);
generate_random_graph(g, 20, 40, rng);
auto weightmap = get(boost::edge_weight, g);
for (auto ed : boost::make_iterator_range(edges(g)))
put(weightmap, ed, wdist(rng));
}
print_graph(g);
std::vector<std::vector<int> > mat(num_vertices(g), std::vector<int>(num_vertices(g)));
std::cout << "foo(g, mat): " << foo(g, mat) << "\n";
for (auto& row : mat) {
for (auto i : row) {
if (i == std::numeric_limits<int>::max())
std::cout << "## ";
else
std::cout << std::setw(2) << i << " ";
}
std::cout << "\n";
}
}
打印(例如,随机生成的图形):
0 --> 2 16
1 --> 11 5
2 --> 8 10 17 10
3 --> 13 16 16
4 -->
5 --> 16
6 -->
7 --> 19 3 9 18
8 --> 10
9 --> 13
10 --> 6
11 --> 4 4 16 19
12 --> 11 3 1 1 11
13 --> 10 5
14 --> 10 1
15 --> 1 13
16 --> 8
17 --> 15 2
18 --> 4
19 --> 0 9
foo(g, mat): 20
0 23 9 ## 27 29 20 ## 12 35 17 26 ## 26 ## 19 2 15 ## 31
13 0 22 ## 4 6 30 ## 21 12 27 3 ## 20 ## 32 11 28 ## 8
27 14 0 ## 18 20 11 ## 10 26 8 17 ## 17 ## 10 25 6 ## 22
## ## ## 0 ## 6 15 ## 16 ## 12 ## ## 2 ## ## 6 ## ## ##
## ## ## ## 0 ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## 0 24 ## 15 ## 21 ## ## ## ## ## 5 ## ## ##
## ## ## ## ## ## 0 ## ## ## ## ## ## ## ## ## ## ## ## ##
8 31 17 8 5 14 23 0 20 2 20 34 ## 10 ## 27 10 23 1 3
## ## ## ## ## ## 9 ## 0 ## 6 ## ## ## ## ## ## ## ## ##
## ## ## ## ## 12 21 ## 27 0 18 ## ## 8 ## ## 17 ## ## ##
## ## ## ## ## ## 3 ## ## ## 0 ## ## ## ## ## ## ## ## ##
10 33 19 ## 1 21 28 ## 19 9 25 0 ## 17 ## 29 9 25 ## 5
18 5 27 3 9 9 18 ## 19 17 15 8 0 5 ## 37 9 33 ## 13
## ## ## ## ## 4 13 ## 19 ## 10 ## ## 0 ## ## 9 ## ## ##
21 8 30 ## 12 14 7 ## 29 20 4 11 ## 28 0 40 19 36 ## 16
17 4 26 ## 8 10 20 ## 25 16 17 7 ## 7 ## 0 15 32 ## 12
## ## ## ## ## ## 19 ## 10 ## 16 ## ## ## ## ## 0 ## ## ##
21 8 3 ## 12 14 14 ## 13 20 11 11 ## 11 ## 4 19 0 ## 16
## ## ## ## 4 ## ## ## ## ## ## ## ## ## ## ## ## ## 0 ##
5 28 14 ## 32 16 25 ## 17 4 22 31 ## 12 ## 24 7 20 ## 0
关于c++ - Boost Dijkstra 代码导致段内存损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47908325/
谁能告诉我这个 Dijkstra 算法中优先级队列的空间复杂度。请注意,这里可以将一个顶点添加到队列中不止一次。但是,由于访问集,它不会被处理超过一次。这就是为什么我想知道队列的最大大小可以达到的原因
为什么我们不能将 Dijkstra 算法应用于具有负权重的图? 最佳答案 如果每次从 C 到 D 旅行都得到报酬,那么找到从 A 到 B 的最便宜的路径意味着什么? 如果两个节点之间存在负权重,则“最
我正在阅读 工作中的程序员 . 我在 Donald Knuth 的采访中看到了这一段。 Seibel: It seems a lot of the people I’ve talked to had
我一整天都在努力理解 Dijkstra 算法并实现,但没有取得任何重大成果。我有一个城市及其距离的矩阵。我想做的是给定一个起点和一个终点,找到城市之间的最短路径。 示例: __0__ __1
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
一 问题描述 小明为位置1,求他到其他各顶点的距离。 二 实现 package graph.dijkstra; import java.util.Scanner; import java.util.
一 问题背景 在现实生活中,很多问题都可以转化为图来解决问题。例如,计算地图中两点之间的最短距离、网络最小成本布线,以及工程进度控制,等等。这些问题都涉及最小路径的求解。 二 Dijkstra 算法
谁能告诉我这个程序的错误在哪里,这真的很有帮助,我尽力解决了这个问题,这段代码只通过了两个测试用例给定一个无向图和一个起始节点,确定从起始节点到图中所有其他节点的最短路径的长度。如果一个节点不可到达,
除了 Dijkstra 之外,还有其他方法可以计算接近完整图的最短路径吗?我有大约 8,000 个节点和大约 1800 万条边。我已经完成了线程 "a to b on map"并决定使用 Dijkst
我知道 Dijkstra 的算法、Floyd-Warshall 算法和 Bellman-Ford 算法,用于查找图中 2 个顶点之间的最便宜路径。 但是当所有边的成本都相同时,最便宜的路径是边数最少的
我的问题如下:根据不同的消息来源,Dijkstra 算法只不过是 Uniform Cost Search 的一种变体。我们知道 Dijkstra 的算法会找到源和所有目的地(单源)之间的最短路径。但是
所以我的问题是我有一个带有 的有向图 G非负 边长度,我希望找到两个节点 u 和 v 之间的最短路径,以便它们只通过图中的一个标记节点。 如果我们没有涉及标记节点的条件,这个问题可以使用 Dijkst
对于使用最小堆优先级队列的 Dijkstra 实现,我将其设置为查找网络上不存在的站,以便它必须检查所有内容。我的问题是由于整体时间复杂度 O(V + E log V) ,为什么网络查找到一个站点的最
我试图找出是否可以使用 Dijkstra 算法来找到有向无环路径中的最长路径。我知道由于负成本循环,不可能在一般图中找到 Dijkstra 的最长路径。但我认为它应该在 DAG 中工作。通过谷歌我发现
我正在研究 Dijkstra 算法,我真的需要找到所有可能的最短路径,而不仅仅是一条。我正在使用邻接矩阵并应用 Dijkstra 算法,我可以找到最短路径。但是我需要以最低成本找到所有路径,我的意思是
我正在尝试创建 Dijkstra 寻路的实现,除了我要求它创建一条在同一位置开始和结束的路线之外,它似乎工作得很好。 JSFiddle:http://jsfiddle.net/Lt6b4ecr/ 我需
我们可以使用负权重的 Dijkstra 算法吗? 停止! 在您认为“大声笑,您可以在两点之间无休止地跳跃并获得无限便宜的路径”之前,我更多地考虑的是单向路径。 对此的应用程序将是一个带有点的山地地形。
我认为 Dijkstra 算法是确定的,因此,如果您选择相同的起始顶点,您将得到相同的结果(到每个其他顶点的距离相同)。但我不认为它是确定性的(它为每个操作定义了以下操作),因为这意味着它不必首先搜索
我找到了this code使用 Dijkstra 算法来查找加权图中两个节点之间的最短路径。我看到的是代码没有跟踪访问过的节点。但是它对于我尝试过的所有输入都适用。我添加了一行代码来跟踪访问过的节点。
我将 Dijkstra 算法 的 C++ 实现转换为 Java。当我运行 Java 代码时,我没有得到预期的输出 我的 C++ 代码的预期: Minimum distance for source v
我是一名优秀的程序员,十分优秀!