Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中使用拓扑排序实现DFS时出错_Java_Algorithm_Computer Science_Depth First Search_Topological Sort - Fatal编程技术网

在java中使用拓扑排序实现DFS时出错

在java中使用拓扑排序实现DFS时出错,java,algorithm,computer-science,depth-first-search,topological-sort,Java,Algorithm,Computer Science,Depth First Search,Topological Sort,我想使用DFS对该图进行排序,以解决拓扑排序问题: 我使用了给定的java代码,得到了一个不正确的输出,因为输出中的g和e在b之前,根据对流层排序,b必须首先出现。我做错了什么 代码是: class vertex{ public char label; public vertex(char lab) { label = lab; } } class DFS { private final int Size = 10; priva

我想使用DFS对该图进行排序,以解决拓扑排序问题:

我使用了给定的java代码,得到了一个不正确的输出,因为输出中的g和e在b之前,根据对流层排序,b必须首先出现。我做错了什么

代码是:

class vertex{
    public char label;
    public vertex(char lab)
    {
        label = lab;
    }
}
class DFS {

    private final int Size = 10;
    private final vertex vertexList[];
    private final int adjList[][];
    private int nVerts;
    private final char sortedArray[];

    public DFS(){
        vertexList = new vertex[Size];
        adjList = new int [Size][Size];
        nVerts = 0;
        sortedArray = new char[Size];
    }


    public void addVertex(char lab) {
        vertexList[nVerts++] = new vertex(lab);
    }

    public void addEdge(int start, int end) {
        adjList[start][end] = 1;
    }

    public void displayVertex(int v) {
        System.out.println(vertexList[v].label);
    }

    public void topo() {
        int orig_nVerts = nVerts;

        while (nVerts>0) {
            int currentVertex = noSuccessors();
            if (currentVertex == -1)
            {
                System.out.println("Error: Graph has cycle");
                return;
            }
            sortedArray[nVerts-1]= vertexList[currentVertex].label;
            deleteVertex(currentVertex);
        }
        System.out.println("The DFS graph using topological sort: ");
        for (int i =0; i<orig_nVerts; i++)
        {
            System.out.print(sortedArray[i] + " ");
        }
        System.out.println("");
    }

    public int noSuccessors()
    {
        boolean isEdge;

        for(int row=0; row<nVerts; row++)
        {
            isEdge = false;
            for(int col=0; col<nVerts; col++) {
                if(adjList[row][col] >0) {
                    isEdge = true;
                    break;
                }
            }
            if(!isEdge)
                return row;
        }
        return -1;
    }

    public void deleteVertex(int delVert) {

        if(delVert != nVerts-1) {
            for(int j=delVert; j<nVerts-1; j++) {
                vertexList[j] = vertexList[j+1];
            }

            for(int row= delVert; row<nVerts-1; row++) {
                moveRowUp(row, nVerts);
            }

            for (int col= delVert; col<nVerts-1; col++) {
                movecolLeft(col, nVerts-1);
            }
        }
        nVerts--;
    }

    private void moveRowUp(int row, int length) {
        for (int col= 0; col<length; col++) {
            adjList[row][col] = adjList[row+1][col];
        }
    }

    private void movecolLeft(int col, int length) {
        for (int row= 0; row<length; row++) {
            adjList[row][col] = adjList[row][col+1];
        }
    }

}

public class TopologicalSort {
    public static void main(String[] args)
    {
        DFS D = new DFS();
        D.addVertex('d');
        D.addVertex('a');
        D.addVertex('c');
        D.addVertex('b');
        D.addVertex('g');
        D.addVertex('f');
        D.addVertex('e');

        D.addEdge(0, 1); //da
        D.addEdge(0, 3); //db
        D.addEdge(0, 2); //dc
        D.addEdge(0, 5); //df
        D.addEdge(0, 4); //dg
        D.addEdge(1, 3); //ab
        D.addEdge(1, 2); //ac
        D.addEdge(2, 4); //bg
        D.addEdge(2, 6); //be
        D.addEdge(3, 5); //cf
        D.addEdge(4, 5); //gf
        D.addEdge(4, 6); //ge

        D.topo();
    }
}
类顶点{
公共字符标签;
公共顶点(字符实验室)
{
标签=实验室;
}
}
类DFS{
私有最终整数大小=10;
私有最终顶点顶点列表[];
私有最终整数调整列表[];
私人投资;
Darray[]的私人最终许可证;
公共DFS(){
vertexList=新顶点[大小];
adjList=新整数[大小][大小];
nVerts=0;
SorterDarray=新字符[大小];
}
公共void addVertex(字符实验室){
vertexList[nVerts++]=新顶点(实验室);
}
公共无效添加(整数开始,整数结束){
adjList[start][end]=1;
}
公共void显示顶点(int v){
System.out.println(vertexList[v].label);
}
公共空间地形图(){
int orig_nVerts=nVerts;
而(nVerts>0){
int currentVertex=noSuccessors();
如果(currentVertex==-1)
{
System.out.println(“错误:图形有循环”);
返回;
}
sortedArray[nVerts-1]=顶点列表[currentVertex]。标签;
deleteVertex(currentVertex);
}
System.out.println(“使用拓扑排序的DFS图:”);
对于(int i=0;i),请释放并添加预期输出。