这是我的两节课:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class TopoSort {
public static void main(String[] args) throws FileNotFoundException {
File textFile = new File("graphs.txt");
Scanner in = new Scanner(textFile);
int numGraphs = in.nextInt();
for(int i=0;i<1;i++)
{
int nodeNum = in.nextInt();
tsMakeGraph graph1 = new tsMakeGraph(nodeNum);
int[][] adjArray = new int[nodeNum][nodeNum];
for(int j=0;j<nodeNum;j++)
{
for(int k=0;k<nodeNum;k++)
{
adjArray[j][k] = in.nextInt();
}
for(int n=0;n<nodeNum;n++)
{
graph1.addNode(n);
}
}
for(int j=0;j<nodeNum;j++)
{
for(int k=0;k<nodeNum;k++)
{
if(adjArray[j][k] == 1)
{
graph1.makeEdge(j, k);
}
}
}
graph1.topologicalSort();
}
}
}
和
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class tsMakeGraph {
private Node nodeList[];
private int adjMatrix[][];
private int numNodes;
private int topoArray[];
public tsMakeGraph(int nodeNum) {
nodeList = new Node[nodeNum];
adjMatrix = new int[nodeNum][nodeNum];
numNodes = 0;
for (int i = 0; i < nodeNum; i++) {
for (int k = 0; k < nodeNum; k++) {
adjMatrix[i][k] = 0;
}
}
topoArray = new int[nodeNum];
}
public void addNode(int i) {
nodeList[numNodes++] = new Node(i);
}
}
我通过for循环添加节点时遇到了超出范围的错误,但是如果我通过绑定graph1.addNode(0),graph1.addNode(2),graph1.addNode(3),graph1手动添加节点.addNode(numNodes),它将正常工作。这对我来说没有意义,我一直在绞尽脑汁哈哈。顺便说一句,我编辑了大部分拓扑图类,因为这是一个硬件项目。
最佳答案
缩短代码一点,您可以这样:
for(int j=0;j<nodeNum;j++)
{
for(int n=0;n<nodeNum;n++)
{
graph1.addNode(n);
}
}
public class tsMakeGraph {
public tsMakeGraph(int nodeNum) {
nodeList = new Node[nodeNum];
}
public void addNode(int i) {
nodeList[numNodes++] = new Node(i);
}
}
因此,这里发生的是您有一个包含
nodeNum
个元素的数组,但您尝试将其添加nodeNum^2
次。我无法告诉您告诉“正确”解决方案的目的。如果
nodeList
应具有与adjMatrix
相同的元素数,则应像new Node[nodeNum * nodeNum]
那样实例化它。 (与topoArray
相同吗?)或者,如果nodeList
应包含整数0...nodeNum-1
,则应将其拉出嵌套循环。