有向图查找环
import java.util.Scanner;
import java.util.Stack;
public class DirectedCycle {
private boolean onStack[];
private boolean marked[];
private int edgeTo[];
private Stack<Integer> cycle;
public DirectedCycle(Digraph G) {
int V = G.getV() + 1;
onStack = new boolean[V];
marked = new boolean[V];
edgeTo = new int[V];
for (int i = 1; i < V; i++) {
if (!marked[i]) {
dfs(G, i);
}
}
}
private void dfs(Digraph g, int v) {
marked[v] = true;
onStack[v] = true;
for (int w : g.adj(v)) {
if (!marked[w]) {
edgeTo[w] = v;
dfs(g, w);
}
if (this.hasCycle()) {
return;
}
if (onStack[w]) {
cycle = new Stack<Integer>();
for (int x = v; x != w; x = edgeTo[x]) {
cycle.push(x);
}
cycle.push(w);
cycle.push(v);
}
}
onStack[v] = false;
}
public boolean hasCycle() {
return cycle != null;
}
public Iterable<Integer> Cycle() {
return cycle;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int v = sc.nextInt();
int e = sc.nextInt();
Digraph R = new Digraph(v);
for (int i = 0; i < e; i++) {
int v1 = sc.nextInt();
int v2 = sc.nextInt();
R.addEdge(v1, v2);
}
DirectedCycle D = new DirectedCycle(R);
Stack<Integer> stack = (Stack<Integer>) D.Cycle();
if (stack != null) {
System.out.println("这个图中存在一条环,这条环是");
System.out.print(stack);
} else {
System.out.println("图中不存在环");
}
}
}
在这里附上有向图的储存类
这里有向图的储存用到了邻接表
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Digraph {
private int V;
private int E;
private List<Integer> adj[];
public Digraph(int v) {
this.V = v;
this.E = 0;
adj = new List[v+1];
for (int i = 0; i < adj.length; i++) {
adj[i] = new ArrayList<Integer>();
}
}
public void addEdge(int v, int w) {
adj[v].add(w);
E++;
}
public Iterable<Integer> adj(int v) {
return adj[v];
}
public int getV() {
return V;
}
public int getE() {
return E;
}
public Digraph reverse() {
Digraph R=new Digraph(V);
for(int v=1;v<V+1;v++) {
for(int w:adj(v)) {
R.addEdge(w, v);
}
}
return R;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int v=sc.nextInt();
int e=sc.nextInt();
Digraph R=new Digraph(v);
for(int i=0;i<e;i++) {
int v1=sc.nextInt();
int v2=sc.nextInt();
R.addEdge(v1, v2);
}
System.out.println("反向图:");
Digraph D=R.reverse();
for(int i=0;i<v+1;i++) {
System.out.println(i+"-->"+D.adj[i]);
}
System.out.println("-----------------------");
System.out.println("原图:");
for(int i=0;i<v+1;i++) {
System.out.println(i+"-->"+R.adj[i]);
}
System.out.println("图中边数:"+D.getE());
System.out.println("图中顶点数:"+R.getV());
}
}