本文共 1462 字,大约阅读时间需要 4 分钟。
package Graph;import java.util.ArrayList;import java.util.LinkedList;import java.util.Scanner;import java.util.Stack;public class DirectedCycle { int v, e; boolean []visit; boolean []onStack; int []path; boolean hasCycle = false; int s; Stackstack; LinkedList []adj; public static void main(String[] args) { new DirectedCycle().run(); } public void run() { Scanner in = new Scanner(System.in); v = in.nextInt(); e = in.nextInt(); visit = new boolean[v+1]; onStack = new boolean[v+1]; adj = new LinkedList[v+1]; path = new int[v]; stack = new Stack<>(); for(int i = 0; i < v; i++ ) { adj[i] = new LinkedList<>(); } for(int i = 0; i < e; i++ ) { int a = in.nextInt(); int b = in.nextInt(); adj[a].offer(b); } for(int i = 0; i < v; i++ ) { if(!visit[i]) dfs(i); } if(hasCycle) printPath(); else { System.out.println("No cycle!"); } } public void printPath() { boolean flag = true; while(!stack.isEmpty()) { if(flag) { System.out.print(stack.pop()); flag = false; } else System.out.print("-" + stack.pop()); } } public void dfs(int cur) { visit[cur] = true; onStack[cur] = true; for(int w :adj[cur]) { if(!visit[w]) { path[w] = cur; dfs(w); } else if(onStack[w]) { hasCycle = true; stack.push(cur);//把结束点多入栈一次标记结束位置以区别与其他环 for(int x = cur; x != w; x = path[x])//结束点为当前第一个出现的已标记并且在栈内的点 stack.push(x); stack.push(w); return; } } onStack[cur] = false; } }
转载地址:http://dlimi.baihongyu.com/