我有一个带有顶点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());
}
}
答案 0 :(得分:1)
假设图表是DAG(即图表中没有周期),您可以使用dynamic programming并在线性时间内解决问题。
以下简单声明表征了图表中从u
到v
的路径数量:
如果u=v
则从u
到v
的路径数为1.否则,从u
到v
的路径数量是从w
到v
的路径总数,因此(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;
}