序
所谓拓扑排序是对有向无圈图顶点的一种排序,如果存在一条从v到w的路径指向,则在排序中w就出现在v的后面,典型的例子就是大学的选课问题。一般的有两种解题思路,一种是用非递归的方式来实现、另一种则是用深度访问搜索递归实现。
用非递归的方式实现:
List<Vertex> sortList = new ArrayList<>();
Queue<Vertex> q = new Queue<Vertex>();
void topSort(){
for each Vertex v
if(v.indegree == 0 )
q.enqueue(v);
while( !q.isEmpty()){
Vertex v = q.dequeue();
sortList.add(v);
for each Vertex w adjacent v{
if(--w.indegree == 0)
q.enqueue(w);
}
}
首先找到入度为0的顶点,然后再依次搜索它的邻点,如果邻点的入度减一为0则是我们要找的点,依次类推,最后程序终止,如果sortList.size 不等于 图的顶点个数,则此图为有圈图,如果等于顶点个数,则sortList的顺序就是我们的拓扑排序的结果。
用递归的方式实现:
List<Vertex> sortList = new ArrayList<>();
Queue<Vertex> q = new Queue<Vertex>();
List<Vertex> topSort(){
//找到入度为0的顶点
for each Vertex v
if(v.indegree == 0 )
q.enqueue(v);
for each Vertex v in q
visit(v);
void visit(Vertex v){
if(!v.visit){
v.visit = true;
for each Vertex w adjacent v
visit(w);
sortList.add(v);
}
}
通过访问的深度对图进行排序,如果没有访问过,则将此顶点压入桟中,继续访问邻点,直到没有邻点为止,再依次回退。