使用深度优先搜索来查找节点的唯一路由数

时间:2016-05-30 18:11:17

标签: java algorithm depth-first-search

我有一个带有顶点ABCDE的有向图。使用深度优先搜索,如果我想能够从A-C中找到唯一路径的数量(例如),我将如何进行此操作?这是我目前的DFS。

private final Map<Character, Node> mNodes;
private final List<Edge> mEdges;
private List<Node> mVisited = new ArrayList<>();
int weight;
int numberOfPaths;

public DepthFirstSearch(Graph graph){
    mNodes = graph.getNodes();
    mEdges = new ArrayList<>(graph.getEdges());
    for(Node node : mNodes.values()){
        node.setVisited(false);
    }
}

public void depthFirstSearch(Node source){

    source.setVisited(true);
    List<Edge> neighbours = source.getNeighbouringEdges(mEdges);
    for(Edge edge : neighbours){
        System.out.println(edge.getFrom().getName()+"-"+edge.getTo().getName());
        if(!edge.getTo().isVisited()){

            mVisited.add(edge.getTo());
            weight += edge.getWeight();
            depthFirstSearch(edge.getTo());

        }
    }

1 个答案:

答案 0 :(得分:1)

假设图表是DAG(即图表中没有周期),您可以使用dynamic programming并在线性时间内解决问题。

以下简单声明表征了图表中从uv的路径数量:

如果u=v则从uv的路径数为1.否则,从uv的路径数量是从wv的路径总数,因此(u,w)是图表中的边缘。

该声明暗示了一种简单的递归算法,由以下伪代码给出。请注意,下面的伪代码不使用动态编程,而是使用简单的递归。如果您需要在线性时间内解决问题,则应使用memoization

def count_paths(u,v):
    if u == v: return 1
    count = 0
    for each edge (u,w):
        count += count_paths(w,v)
    return count

这是Java中的代码:

public int countPaths(Graph graph, Node u, Node v) {
    nodes = graph.getNodes();
    edges = new ArrayList<>(graph.getEdges());
    if (u.equals(v)) return 1;
    int count = 0;
    List<Edge> neighbours = u.getNeighbouringEdges(edges);
    for(Edge edge : neighbours){
        w = edge.getTo();
        count += countPaths(graph, w, v);
    }
    return count;
}