使用深度优先搜索来解决有向图中节点的可达性问题,分为单点可达性和多点可达性。DiGraph为有向图结构,请参考上篇《邻接表的有向图》实现
单点可达:给定一副有向图和一个起点s,求是否存在一条从s到v的路径。
多点可达:给定一幅有向图和一个节点的集合,求是否存在一条从集合中的任意顶点到给定顶点的有向路径。
有向图的可达性API:
public class DirectedDFS
DirectedDFS(Digraph G,int s) 在G中找到从s可到达的所有顶点
DirectedDFS(Digraph G,Iterable resource) 在G中找出从resource中的所有顶点可达的所有顶点
boolean marked(int v) v是否可达
public class DirectedDFS{
private boolean[] marked;
public DirectedDFS(Digraph G, int s){
marked = new boolean[G.V()];
bfs(G,s);
}
public DirectedDFS(Digraph G, Iterable<Integer> resource){
marked = new boolean[G.V()];
for(int v: resource){
dfs(G,v);
}
}
private void bfs(Digraph G, int v){
marked[v] = true;
for(int w:G.adj(v)){
if(!marked[w])
bfs(G,w);
}
}
public boolean marked(int v){
return marked[v];
}
}