import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;
/**
* @author ming
* @create 2022/6/10
* @description:
*/
public class DepthFirstPaths {
private boolean [] marked;
//起点
private int s;
//索引代表顶点,值代表从起点s到当前顶点路径上最后一个顶点
private int[] edgeTo;
public DepthFirstPaths(Graph g,int s) {
//初始化mared数组
this.marked = new boolean[g.v()];
//初始化s起点
this.s = s;
//初始化edge
this.edgeTo = new int[g.v()];
dfs(g,s);
}
private void dfs(Graph g, int v) {
//把v标识已搜索
marked[v] = true;
for (Integer w :g.adj(v)){
if(!marked[w]){
edgeTo[w] = v;//到达顶点路径w,最后一个顶点时v
dfs(g,w);
}
}
}
//判断起点到顶点v是否有路径
public boolean hasPathTo(int v){
return marked[v];
}
public Stack<Integer> pathTo(int v){
if(!hasPathTo(v)){
return null;
}
Stack<Integer> stack = new Stack<>();
stack.push(v);
int temp = edgeTo[v];
while(temp!=s){
stack.push(temp);
temp = edgeTo[temp];
}
//放起点到栈中
stack.push(s);
return stack;
}
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(DepthFirstPaths.class.getClassLoader().getResourceAsStream("traffic_project.txt")));
Graph graph = new Graph(Integer.parseInt(reader.readLine()));
int length = Integer.parseInt(reader.readLine());
for (int i = 0; i < length; i++) {
String[] str = reader.readLine().split(" ");
graph.addEdge(Integer.parseInt(str[0]),Integer.parseInt(str[1]));
}
DepthFirstPaths depthFirstPaths = new DepthFirstPaths(graph, 0);
Stack<Integer> stack = depthFirstPaths.pathTo(4);
while(!stack.isEmpty()){
Integer pop = stack.pop();
System.out.print(pop+" ");
}
}
/**
* 6
* 8
* 0 2
* 0 1
* 2 1
* 2 3
* 2 4
* 3 5
* 3 4
* 0 5
*/
}
DFS路径查找
最新推荐文章于 2024-04-07 10:22:37 发布