BFS使用2个队列查找2d矩阵的最短路径

时间:2016-08-17 21:58:45

标签: java algorithm graph breadth-first-search

我想做的事情:

使用文本文件中的图形,查找并打印从顶点A到顶点B的最短路径(最小顶点数量)。

目前的实施:

public String findPath(int v, int w) {
    Queue<Integer> q = new LinkedList<Integer>();
    boolean[] visited = new boolean[g.numVertices()];
    String[] pathTo = new String[g.numVertices()];

    q.add(v);
    pathTo[v] = v+" ";
    while(q.peek() != null) {
        if(runBFS(q.poll(),w,visited,q,pathTo))
        break;
    }
    return pathTo[w];
}

private boolean runBFS(int v, int w, boolean[] visited, Queue<Integer> q, String[] pathTo) {
    if(visited[v]) {
    }
    else if(v == w)
        return true; 
    }
    else {
        visited[v] = true;
        VertexIterator vi = g.adjacentVertices(v);
        while(vi.hasNext()) {
            int nextVertex = vi.next();
            pathTo[nextVertex] = pathTo[v] + nextVertex + " ";
            q.add(nextVertex);
        }
    }
    return false;
}

v =原点的顶点

w =目标顶点

g = graph

vi =迭代v

的邻居的普通迭代器

现在,它正在使用String []跟踪路径,但我建议有一个解决方案,通过并行运行此队列来保存路径时,使用Queue<ArrayList<Integer>>而不是String[]执行此操作使用q队列。

有人可以指导我完成这个吗?

1 个答案:

答案 0 :(得分:0)

您可以使用第二个队列data("mtcars") train <- mtcars require(randomForest) result <- data.frame() for (i in 1:3){ imp <- importance(randomForest(train[,2:10], y = train[,1], data = train,importance = TRUE, ntree =5000, proximity = TRUE, mtry=3)) result <- rbind(result, imp) } write.csv(result, "D:/vari.csv") Queue<ArrayList<Integer>> q2中的最短路径(ArrayList<Integer>)存储到当前位于v的每个节点,顺序相同。每当您轮询q时,您也会轮询q,并且无论何时向q2添加节点,您都可以通过将最短路径复制到上一个节点并附加到该节点来计算到该节点的最短路径当前节点,并将其添加到q

但请注意,复制最短路径可能需要时间线性的顶点数量,这将增加整体复杂性。因此我不推荐这种方法。相反,对于每个节点n,您可以存储您访问n时来自的上一个节点。一旦到达目标节点w,就可以回溯这些先前的节点以找到从起始节点开始的最短路径。