邻接矩阵中 运行 Dijkstra 算法之后线程 "main" java.lang.StackOverflowError 中的异常
Exception in thread "main" java.lang.StackOverflowError after running Dijkstra's algorithm in an adjacency matrix
我试图在加权邻接矩阵中打印 运行 Dijkstra 算法之后的最短路径。尝试打印路径时出现计算器错误。
我已经尝试将起始节点更改为 long 和 BigInteger 类型,正如该平台上先前答案所建议的那样,我也知道我正在使用递归方法,问题就在于此。
import java.util.*;
public class djikstra {
private static final int invalid = -1;
public djikstra(int matrix[][],int start) {
int numVertices = matrix[0].length;
int [] distances = new int [numVertices];
boolean [] isAdded = new boolean[numVertices];
for (int i=0;i<numVertices;i++) {
distances[i]= Integer.MAX_VALUE;
isAdded[i] = false;
}
distances[(int) start]=0;
int [] parents = new int [numVertices];
parents[start] = invalid;
for(int i=1;i<numVertices;i++) {
int closestNeighbour = -1;
int shortDist = Integer.MAX_VALUE;
for(int j=0; j <numVertices;j++) {
if(!isAdded[j] && distances[j]<shortDist) {
closestNeighbour = j;
shortDist = distances[j];
}
}
isAdded[closestNeighbour]=true;
for(int j = 0; j <numVertices;j++) {
int edgeDist = matrix[closestNeighbour][j];
if(edgeDist > 0 && ((closestNeighbour+edgeDist)<distances[j])) {
parents[j] = closestNeighbour;
distances[j] = shortDist + edgeDist;
}
}
}
printSol(start,distances,parents);
}
private static void printSol(int start,int[] distances,int[] parents) {
int numVertices=distances.length;
for(int i=0;i<numVertices;i++) {
if(i !=start) {
path(i,parents);
}
}
}
private static void path(int curr,int[]parents) {
if(curr== -1) {
return;
}
path(parents[curr],parents);
}
}
public static void Main(String args[]){
int matrix2[][]= {{0, 0, 0, 4, 12, 14, 0, 0, 0, 0, 0 ,0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 12, 0, 8, 0, 18, 15, 7},
{0, 0, 0, 11, 3, 3, 0, 0, 0, 0, 0, 13, 8, 10},
{4, 0, 0, 0, 10, 12, 0, 0, 0, 0, 10, 10, 13, 0},
{0, 0, 3, 10, 0, 2, 0, 0, 0, 0, 0, 10, 5, 11},
{0, 0, 3, 12, 2, 0, 0, 0, 0, 0, 0, 10, 5, 9 },
{20, 0, 0, 0, 0, 0, 0, 14, 10, 20, 16, 22, 0, 0},
{0, 12, 0, 0, 0 ,0 ,14, 0, 4, 6, 12, 0,0, 0 },
{0, 16, 0, 0, 0, 0, 10, 4, 0, 10, 14, 20, 0, 0},
{0, 8, 0, 0, 0, 0, 0, 6, 10, 0, 18, 0, 0, 15 },
{0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, 6, 11, 11},
{0, 0, 0, 10, 10, 10, 0, 0, 0, 0, 6, 0, 5, 11},
{0, 0, 8, 0, 5, 5, 0, 0, 0, 0, 11, 5, 0, 8},
{0, 7, 10, 0, 11, 9, 0, 0, 0, 0, 0, 11, 8, 0}};
djikstra doDjikstra = new djikstra(matrix2,0);
}
Expected results:
0 4 13 1
Actual results:
Exception in thread "main" java.lang.WhosebugError
at helperclasses.djikstra.path(djikstra.java:61)
WhosebugError
是由path
方法中的无限递归触发的。
parents[curr]
永远不会保持 -1(基本情况),因此递归永远不会停止。
您将需要确保 path
最终以 -1 为 curr
调用。
我试图在加权邻接矩阵中打印 运行 Dijkstra 算法之后的最短路径。尝试打印路径时出现计算器错误。
我已经尝试将起始节点更改为 long 和 BigInteger 类型,正如该平台上先前答案所建议的那样,我也知道我正在使用递归方法,问题就在于此。
import java.util.*;
public class djikstra {
private static final int invalid = -1;
public djikstra(int matrix[][],int start) {
int numVertices = matrix[0].length;
int [] distances = new int [numVertices];
boolean [] isAdded = new boolean[numVertices];
for (int i=0;i<numVertices;i++) {
distances[i]= Integer.MAX_VALUE;
isAdded[i] = false;
}
distances[(int) start]=0;
int [] parents = new int [numVertices];
parents[start] = invalid;
for(int i=1;i<numVertices;i++) {
int closestNeighbour = -1;
int shortDist = Integer.MAX_VALUE;
for(int j=0; j <numVertices;j++) {
if(!isAdded[j] && distances[j]<shortDist) {
closestNeighbour = j;
shortDist = distances[j];
}
}
isAdded[closestNeighbour]=true;
for(int j = 0; j <numVertices;j++) {
int edgeDist = matrix[closestNeighbour][j];
if(edgeDist > 0 && ((closestNeighbour+edgeDist)<distances[j])) {
parents[j] = closestNeighbour;
distances[j] = shortDist + edgeDist;
}
}
}
printSol(start,distances,parents);
}
private static void printSol(int start,int[] distances,int[] parents) {
int numVertices=distances.length;
for(int i=0;i<numVertices;i++) {
if(i !=start) {
path(i,parents);
}
}
}
private static void path(int curr,int[]parents) {
if(curr== -1) {
return;
}
path(parents[curr],parents);
}
}
public static void Main(String args[]){
int matrix2[][]= {{0, 0, 0, 4, 12, 14, 0, 0, 0, 0, 0 ,0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 12, 0, 8, 0, 18, 15, 7},
{0, 0, 0, 11, 3, 3, 0, 0, 0, 0, 0, 13, 8, 10},
{4, 0, 0, 0, 10, 12, 0, 0, 0, 0, 10, 10, 13, 0},
{0, 0, 3, 10, 0, 2, 0, 0, 0, 0, 0, 10, 5, 11},
{0, 0, 3, 12, 2, 0, 0, 0, 0, 0, 0, 10, 5, 9 },
{20, 0, 0, 0, 0, 0, 0, 14, 10, 20, 16, 22, 0, 0},
{0, 12, 0, 0, 0 ,0 ,14, 0, 4, 6, 12, 0,0, 0 },
{0, 16, 0, 0, 0, 0, 10, 4, 0, 10, 14, 20, 0, 0},
{0, 8, 0, 0, 0, 0, 0, 6, 10, 0, 18, 0, 0, 15 },
{0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, 6, 11, 11},
{0, 0, 0, 10, 10, 10, 0, 0, 0, 0, 6, 0, 5, 11},
{0, 0, 8, 0, 5, 5, 0, 0, 0, 0, 11, 5, 0, 8},
{0, 7, 10, 0, 11, 9, 0, 0, 0, 0, 0, 11, 8, 0}};
djikstra doDjikstra = new djikstra(matrix2,0);
}
Expected results:
0 4 13 1
Actual results:
Exception in thread "main" java.lang.WhosebugError
at helperclasses.djikstra.path(djikstra.java:61)
WhosebugError
是由path
方法中的无限递归触发的。
parents[curr]
永远不会保持 -1(基本情况),因此递归永远不会停止。
您将需要确保 path
最终以 -1 为 curr
调用。