拓扑排序 解题思路

所谓拓扑排序是对有向无圈图顶点的一种排序,如果存在一条从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);
 }
}

通过访问的深度对图进行排序,如果没有访问过,则将此顶点压入桟中,继续访问邻点,直到没有邻点为止,再依次回退。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值