拓扑排序

拓扑排序(Topological Sort):由某个集合上的一个偏序得到该集合上的一个全序。

偏序关系(Partial Order):若集合X上关系R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。

全序是集合中全体成员之间均可比较。



解决拓扑排序
(1)在有向图中选择一个没有前驱的顶点且输出之。

(2)从图中删除该顶点和所有以它为尾的弧。

 重复上述两步,直至全部顶点均以输出,或者当前图中不存在无前驱的顶点为止。后一种情况则说明有向图中存在环。

计算机中解决

Status TopologicalSort(ALGraph G){
   //有向图G采用邻接表存储结构
  //若G无回路,则输出G的顶点的一个拓扑序列并返回OK,否则ERROR。
  FindInDegree(G,indegree);      //对个顶点求入度indegree[0..vexnum-1]
  InitStack(S);
  for(i=0; i<G.vexnum; ++i)     //建零入度顶点栈S
     if(!indegree[i]) Push(S,i);//入度为0者进栈
  count=0;
  while(!StackEmpty(S)){
     Pop(S,i); printf(i,G.vertices[i].data); ++count; //输出i号顶点并计数
     for(p=G.vertices[i].firstarc;p;p=p->nextarc){
       k=p->adjvex;                     //对i号顶点为每个邻接点的入度减1
       if(!(--indegreee[k])) Push(S,k);//若入度减为0,则入栈    
     }//for
  }//while
  if(count<G.vexnum) return ERROR     //该有向图有回路
  else return OK;
}//TopologicalSort

分析算法,对有n个顶点和e条弧的有向图而言,建立求各顶点的入度时间复杂度为O(e);建零入度顶点栈的时间复杂度为O(n);在拓扑排序过程中,若有向图无环,则每个顶点进一次栈,出一次栈,入度减1的操作在While语句中总共执行e此,所以,总的时间复杂度为O(n+e)。

若已知无环,也可以深度优先搜索遍历。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值