Dijkstra算法在c++中实现并转换为Java
Dijkstra algorithm implemented in C++ and converted to Java
请帮我解决这个问题:我正试图将Dijkstra算法(由教授在c++中实现)翻译为Java,但它不起作用。
int *cost = new int[numVert],
*frj = new int[numVert],
*parent = new int[numVert],
w, w0;
for (w = 0; w < numVert; w++) {
parent[w] = -1;
cost[w] = matrizAdj[_vertInicial][w];
frj[w] = _vertInicial;
}
parent[_vertInicial] = _vertInicial;
cost[_vertInicial] = 0;
while (1) {
int mincost = -1;
for (w = 0; w < numVert; w++) {
if (parent[w] != -1 || cost[w] == 0)
continue; // vert ja alcancado ou nao possui aresta com vert atual.
// se menor que mincost ou mincost == infinito
if (mincost > cost[w] || mincost == -1)
mincost = cost[w0 = w];
}
if (mincost == -1) break;
parent[w0] = frj[w0];
for (w = 0; w < numVert; w++)
if (cost[w] > cost[w0] + matrizAdj[w0][w]) {
cost[w] = cost[w0] + matrizAdj[w0][w];
frj[w] = w0;
}
}
for (w = 0; w < numVert; w++)
cout << " " << parent[w];
教授的版本工作得很好。最后,它将打印一个父节点列表,其中parent[w]是节点w的父节点。
输出示例:0 1 2 0 0 1 0 4 0 2 0.
我用Java写了下面的代码:
double mincost, cost[] = new double[_m.length];
int frj[], parent[], w0;
frj = new int[_m.length];
parent = new int[_m.length];
for (int w = 0; w < _m.length; w++) {
parent[w] = -1;
cost[w] = _m[_root][w];
frj[w] = _root;
}
parent[_root] = _root;
cost[_root] = 0;
w0 = 0;
while (true) {
mincost = -1;
for (int w = 0; w < _m.length; w++) {
if (parent[w] != -1 || cost[w] == 0) {
continue;
}
if (mincost > cost[w] || mincost == -1) {
mincost = cost[w0 = w];
}
}
if (mincost == -1) {
break;
}
parent[w0] = frj[w0];
for (int w = 0; w < _m.length; w++) {
if (cost[w] > cost[w0] + _m[w0][w]) {
cost[w] = cost[w0] + _m[w0][w];
frj[w] = w0;
}
}
}
for (int i = 0; i < parent.length; i++) {
System.out.print(" " + parent[i]);
}
基本上是一样的,除了我的版本使用double来定义成本(边权值)。(双精度值非常接近整数,所以我怀疑这是导致问题的原因)。最后,它打印父元素列表,但列表中的元素始终是_root
值。换句话说,条件"if (cost[w] > cost[w0] + _m[w0][w])"
总是false
(这显然是错误的!)。
输出示例:
0 0 0 0 0 0 0 0 0 0 0.
我是不是漏掉了什么地方?我写错了什么吗?我试图找到这个代码中的错误大约一个小时,但它们看起来是一样的…
谢谢!
我测试了你的算法,它似乎工作得很好。我在这里使用了中的样例图,它返回了预期的结果。
样本图(和邻接矩阵):
b d
O-------O
/| | 0, 2, 3, 1000, 1000, 1000
2/ | 3 | 2 2, 0, 6, 5, 3, 1000
/ | 1| 3, 6, 0, 1000, 1, 1000
a O | | O z 1000, 5, 1000, 0, 1, 2
|6 | / 1000, 3, 1, 1, 0, 4
3 | | /4 1000, 1000, 1000, 2, 4, 0
| |/
O-------O
c d
父母输出:0 0 0 4 2 3
请参见简短演示。
基于以上事实,您的输入(_m
)一定有问题
相关文章:
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- 我需要帮助将我的代码从 c++ 转换为 java
- 将C++映射转换为 Java 映射
- 使用 jni 将返回带有模板的对象的 Java 代码转换为 c++
- C++ (U256)*(H256 const*)(char*[] + int) 将重写转换为 Java
- JNA 将 HICON 转换为 Java Image
- 从c++到java的矢量转换
- 如何将通过TCP发送数据的数据从C++转换为Java
- 如何将 Java double[][] 转换为 C++ <vector<vector>> JNI?
- 如何通过 JNI 将 java CharSequence 转换为 c++ char*
- 将 Java LinkedHashMap 转换为 C++ std::map
- 将本机C 代码转换为Java
- 在使用 JNI 将 c++ unordered_map转换为 java hashMap之前将其转换为 java hash
- 将 C++ 中的字符值转换为具有与 Java 中相同值的字符串
- 如何将 GLCM 的实现转换为 Java C++
- 将 C++ 中的结构转换为 Java 中的类
- 将 Java ArrayList 转换为 C++ 向量时出现问题
- FlatBuffers C++从缓冲区转换为对象,仅适用于root_type(而Java具有所有)
- 将 JNI -> jobject(基本上是 java 文件中的映射和/或映射的映射)转换为 std::map(c++)
- 使用正确的数据类型转换java中的c++方法逻辑