![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/024759e6af5a201783388b912f5a7de6.jpeg)
package com.example.demo.code60;
import com.example.demo.code10.queue.Queue;
public class Digraph {
private int v;
private int E;
private Queue<Integer>[] adj;
public Digraph(int v) {
this.v = v;
this.E = 0;
this.adj = new Queue[v];
for (int i = 0; i < adj.length; i++) {
adj[i] = new Queue<Integer>();
}
}
public void addEdge(int v,int w){
adj[v].enqueue(w);
E++;
}
public int v(){
return v;
}
public int E(){
return E;
}
public Queue<Integer> adj(int v){
return adj[v];
}
public Digraph reverse(){
Digraph reverseGraph = new Digraph(v);
for (int i = 0; i < v; i++) {
for (int integer : adj[i]) {
reverseGraph.addEdge(integer,i);
}
}
return reverseGraph;
}
}
package com.example.demo.code60;
import com.example.demo.code10.queue.Queue;
import com.example.demo.code10.stack.Stack;
public class DepthFirstOrder {
private boolean[] marked;
private Stack<Integer> reversePost;
public DepthFirstOrder(Digraph g){
this.marked = new boolean[g.v()];
this.reversePost = new Stack<Integer>();
for (int i = 0; i < g.v(); i++) {
if(!marked[i]){
dfs(g,i);
}
}
}
private void dfs(Digraph g,int v) {
marked[v] = true;
Queue<Integer> adj = g.adj(v);
for (Integer w : adj) {
if(!marked[w]){
dfs(g,w);
}
}
reversePost.push(v);
}
public Stack<Integer> reversePost(){
return reversePost;
}
}
``package com.example.demo.code60;
import com.example.demo.code10.queue.Queue;
public class DirectedCycle {
private boolean [] marked;
private boolean hasCycle;
private boolean[] onStack;
public DirectedCycle(Digraph g) {
this.marked = new boolean[g.v()];
this.hasCycle = false;
this.onStack = new boolean [g.v()];
for (int i = 0; i < g.v(); i++) {
if(!marked[i]){
dfs(g,i);
}
}
}
private void dfs(Digraph g,int v ) {
marked[v] = true;
onStack[v] = true;
Queue<Integer> adj = g.adj(v);
for (Integer w : adj) {
if (!marked[w]) {
dfs(g,w);
}
if(onStack[w]){
hasCycle = true;
return ;
}
}
onStack[v] = false;
}
public boolean hasCycle(){
return hasCycle;
}
}
package com.example.demo.code60;
import com.example.demo.code10.stack.Stack;
public class TopoLogical {
private Stack<Integer> order;
public TopoLogical(Digraph g) {
DirectedCycle cycle = new DirectedCycle(g);
if(!cycle.hasCycle()){
DepthFirstOrder depthFirstOrder = new DepthFirstOrder(g);
order = depthFirstOrder.reversePost();
}
}
private boolean isCycle(){
return order==null;
}
public Stack<Integer> order(){
return order;
}
public static void main(String[] args) {
Digraph digraph = new Digraph(6);
digraph.addEdge(0,2);
digraph.addEdge(0,3);
digraph.addEdge(2,4);
digraph.addEdge(3,4);
digraph.addEdge(4,5);
digraph.addEdge(1,3);
TopoLogical logical = new TopoLogical(digraph);
Stack<Integer> order = logical.order();
for (Integer integer : order) {
System.out.print(integer+"->");
}
}
}