ACM课件(lecture_06)并查集 学习笔记<三> --拓扑排序

一、拓扑排序

由某个集合上的一个偏序得到该集合上的一个全序。实际上是将图G中所有顶点排成一个线性序。直观来看,偏序指集合中只有部分成员之间可以比较,而全序是指集合中全体成员之间均可以比较。

二、对一个有向无环图进行拓扑排序

是将图中所有顶点排成一个线性序列,若将图中顶点按拓扑次序排成一行,则所有的有向边均是从左指向右的。显然,若图中存在有向环,则不可以进行拓扑排序。

三、可以用有向图表示一个工程。

在这种有向图中,用顶点表示活动,用有向边<Vi,Vj>表示活动Vi必须先于活动Vj进行,即用弧表示活动间的优先关系。这种有向图叫做顶点表示活动的AOV网络(Activity On Vertices)。

四、AOV网络

在AOV网络中,如果活动Vi 必须在活动Vj 之前进行,则存在有向边<Vi,Vj>,AOV网络中不能出现回路,即有向环。在AOV网络中如果出现了有向环,则意味着某项活动应以自己作为先决条件。因此,对给定的AOV网络,必须先判断它是否存在有向环。

五、检测是否有有向环的一种方法是对AOV网络构造它的拓扑有序序列。

即将各个顶点(代表各个活动)排列成一个线性有序的序列,使得AOV网络中所有应存在的前驱和后继关系都能得到满足。这种构造AOV网络全部顶点的拓扑有序序列的运算就叫做拓扑排序。

1、如果通过拓扑排序能将AOV网络的所有顶点都排入一个拓扑有序的序列中,则该AOV网络中必定不会出现有向环;

2、相反,如果得不到满足要求的拓扑有序序列,则说明AOV网络中存在有向环,此AOV网络所代表的工程是不可行的。

下图中由于不存在有向环,因此可以得到拓扑序列。所以,按照这个方法排课是可行的。

例如:对学生选课工程图进行拓扑排序,得到的拓扑有序序列为:

C1,C2,C3,C4,C5,C6,C8,C9,C7

或 C1,C8,C9,C2,C5,C3,C4,C7,C6

                                                                                   

 

                       

 

六、拓扑排序算法思想

1、在AOV网络中选一个没有直接前驱的顶点, 并输出之;

2、从图中删去该顶点, 同时删去所有它发出的有向边;

3、重复以上步骤, 直到

◆ 全部顶点均已输出,拓扑有序序列形成,拓扑排序完成;

◆ 或者图中还有未输出的顶点,但已跳出处理循环。这说明图中还剩下一些顶点,它们都有直接前驱,再也找不到没有前驱的顶点了。这时AOV网络中必定存在有向环。

 

七、拓扑排序算法

status topologicalsort(ALGraph G){

 //有向图G采用邻接表存储结构

 //若G无回路,则输出G的顶点的一个拓扑序列并返回ok,否则error

  Findindegree(G,indegree);

  Initstack(s);

  For(i=0;i<G.vexnum;++i)

  If(!indegree[i]) push(s,i);

  Count=0;

  While(!stackempty(s)){

    Pop(s,i);printf(G.vertices[i].data);++count; //输出I号顶点并计数

    For(p=G.vertices[i].firstarc;p;p=p->next){

      K=p->adjvex;           //对I号顶点的每个邻接点的入度减1

      If(!(--indegree[k])) push(s,k);      //若入度减为0,则入栈

    }

  }

  if(count<G.vexnum) return error;         //该有向图有回路

  else return ok;

}

八、拓扑排序算法小结

分析此拓扑排序算法可知,如果AOV网络有n个顶点,e条边,在拓扑排序的过程中,搜索入度为零的顶点,建立顶点栈所需要的时间是O(n)。在正常的情况下,有向图有n个顶点,每个顶点进一次栈,出一次栈,共输出n次。顶点入度减一的运算共执行了e次。所以总的时间复杂度为O(n+e)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值