【发布时间】:2016-01-04 10:31:26
【问题描述】:
我已经为一个项目用 java 编写了以下 dijkstra 实现。当我运行测试时,如果 startNode 是 0 节点,它可以正常工作,但如果 startNode 是另一个节点,它就不会。谁能帮助我?不胜感激……
代码如下:
double[][] nodesDistance = new double[graph.getNumOfNodes()][graph.getNumOfNodes()];
double[] distance = new double[graph.getNumOfNodes()];
int[] preD = new int [graph.getNumOfNodes()];
int[] visited = new int [graph.getNumOfNodes()];
double min;
int nextNode = 0;
for (int i = startNode; i < 0; i--) {
visited[i] = 0;
preD[i] = 0;
for (int j = startNode; j < 0; j--) {
if (graph.existsEdge(i, j) == true) {
nodesDistance[i][j] = graph.getEdgeDistance(i, j);
}else {
nodesDistance[i][j] = Double.POSITIVE_INFINITY;
}
}
}
for (int i = startNode; i < graph.getNumOfNodes(); i++) {
visited[i] = 0;
preD[i] = 0;
for (int j = startNode; j < graph.getNumOfNodes(); j++) {
if (graph.existsEdge(i, j) == true) {
nodesDistance[i][j] = graph.getEdgeDistance(i, j);
}else {
nodesDistance[i][j] = Double.POSITIVE_INFINITY;
}
}
}
distance = nodesDistance[startNode];
distance[startNode] = 0;
visited[startNode] = 1;
for (int i = startNode; i < 0; i--) {
min = 999.0;
for (int j = startNode; j < 0; j--) {
if ((min > distance[j]) && (visited[j] != 1)) {
min = distance[j];
nextNode = j;
}
}
visited[nextNode] = 1;
for (int c = startNode; c < 0; c--) {
if (visited[c] != 1) {
if (min + nodesDistance[nextNode][c] < distance[c]) {
distance[c] = min + nodesDistance[nextNode][c];
preD[c] = nextNode;
}
}
}
}
for (int i = startNode; i < graph.getNumOfNodes(); i++) {
min = 999.0;
for (int j = startNode; j < graph.getNumOfNodes(); j++) {
if ((min > distance[j]) && (visited[j] != 1)) {
min = distance[j];
nextNode = j;
}
}
visited[nextNode] = 1;
for (int c = startNode; c < graph.getNumOfNodes(); c++) {
if (visited[c] != 1) {
if (min + nodesDistance[nextNode][c] < distance[c]) {
distance[c] = min + nodesDistance[nextNode][c];
preD[c] = nextNode;
}
}
}
}
for (int i = 0; i < graph.getNumOfNodes(); i++) {
result.nodeDistance[i] = distance[i];
result.nodeThrough[i] = preD[i];
}
【问题讨论】:
-
for (int i = startNode; i < 0; i--)什么都不做。也许改成i >= 0;? -
由于 Dijkstra 是基于 BFS 的算法,它需要访问所有节点。如果您从不是搜索树的起始节点的地方开始,您将跳过某些节点。您的起始节点应始终为 0,如果您希望另一个节点成为您的起始节点,则需要更改输入树。显然你不必这样做,但从它的外观看你的代码坚持它(我可能错了)
-
你为什么要把它放在一个不错的 answrr 伙计身上??
-
startNode 为 0 时它什么也不做,我在 startNode 不为 0 时写了这个。
-
问题是@Glubus,我没有定义哪个 startNode 将是测试,我有 77 个测试要运行。其中 10 个的 startNode 为 0,但其他的没有,这是我的问题。
标签: java graph nodes dijkstra shortest-path