拓扑排序
对拓扑排序的介绍,我分成了三部分
1:判断有向图中是否有环;
2:基于深度优先的顶点排序;
3:拓扑排序的实现。
想要弄懂拓扑排序,需要你提前了解如何判断图中是否有环一节基于深度优先的顶点排序。
下面为其介绍:
判断图中是否有环:判断图中是否有环
基于深度优先的顶点排序:基于深度优先的顶点排序
拓扑排序的API设计:
代码实现:
package cn.itcast.demo.day02.algorithm;
import cn.itcast.demo.day02.linear.Stack;
public class TopoLogical {
//顶点的拓扑排序
private Stack<Integer> order;
//构造拓扑排序对象
public TopoLogical(Digraph G){
//创建一个检测有向环的对象
DirectedCycle cy = new DirectedCycle(G);
//判断G图中有没有环,如果没有环,则进行顶点排序:创建一个顶点排序对象
if(!cy.hasCycle()){
DepthFirstOrder depthFirstOrder = new DepthFirstOrder(G);
order = depthFirstOrder.reversePost();
}
}
/**
* 判断图G中是否有环
* @return
*/
private boolean isCycle(){
//比较讨巧的写法,如果cy.hasCycle() == true,那么order就不会被赋值,则order == null
return order == null;
}
/**
* 获取拓扑排序的所有顶点
* @return
*/
public Stack<Integer> order(){
return order;
}
}