7.6 拓扑排序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
构造拓扑排序方法:
STEP 1:在有向图中任选一个没有前驱的顶点且输出之 STEP 2:从图中删除该顶点和所有以它为尾的弧 STEP 3:重复上述两步,若全部顶点均可输出,则不存在环;
若当前图中不存在无前驱的顶点,则一定存在环
7.6 拓扑排序
存储结构选择
邻接表: 需要不断地动态删除顶点及其邻接边 无前驱顶点: 入度为0的顶点
7.6 拓扑排序
案例1:关系合法性判断 HDU3342 案例2:比赛名次排序 HDU1285
7.6 拓扑排序
案例1:关系合法性判断 HDU3342
题目大意:每个人都可以有多个师傅,并且师徒关系是可以传递的,即我师傅的 师傅也是我的师傅,我徒弟的徒弟也是我的徒弟。 逻辑要求:若存在:自己的徒弟是自己的师傅,输出NO;如果全部人员关系符 合题目要求,则输出YES
7.6 拓扑排序
B
E
AOV网:
A
F CD
施工流程图是有向图
H
K
G I
J
L
顶点表示独立活动 弧表示活动间的优先关系 AOV网中不能存在回路
概念定义:设G(V, E)是一个具有n个顶点的有向图,若将有向图中的顶点 以线性方式进行排序,则对于任何连接自顶点u到顶点v的有向边(u,v),排 序结果中顶点u总是在顶点v的前面。
7.6 拓扑排序
基本概念 拓扑排序、偏序和全序
核心任务 判断AOV-网中是否存在环
算法实现
利用:顶点入度数组、零度顶点队列、顶点统计变量
思路:(1)在有向图中选择一个无前驱顶点v输出; (2)删除与顶点v的所有邻接边 重复上述步骤,若所有顶点均输出则无环
应用价值 判断工程的各个子项目能否按照既定序列顺利实施
7.6 拓扑排序
偏序和全序的概念 偏序:集合中仅仅部分成员间可比较优先关系
全序:集合中所有成员之间均可比较优先关系
2 1
3
偏序关系图
1
2
3
全序关系图
偏序关系的排序结果不唯一,全序关系的排序结果唯一。
7.6 拓扑排序
拓扑排序重点 检测AOV-网中是否存在环
检测是否存环方法: 对有向图构造其顶点的拓扑有序序列 若网中所有顶点都在拓扑有序序列中,则必定不存在环
题目大意:有N个比赛队(1≤N≤500),编号依次为1,2,3,…,N进行比赛, 比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员 会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,若P1赢P2则排名 时P1在P2之前。现在请你编程序确定排名。 输入格式:输入有若干组,每组中的第一行有两个数N和M;其中N表示队伍的 个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数 P1和P2表示即P1队赢了P2队。 结果要求:给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面 没有空格。 其它说明:符合条件的排名可能不唯一,此时要求输出时编号小优先输出;另外 输入数据保证确保一定能有一个符合要求的排名。
7.6 拓扑排序
课程代码
课程名称
A
C语言程序设计
B
数据结构
C
数据库原理
D
计算机网络
E
算法设计与分析
F
操作系统
G
大学物理
H
数字电路技术
I
计算机组成原理
J
计算机接口技术
K
无线传感网络
L
嵌入式系统源自文库成
先行课程
A B C B D、E
A、G G、H H、I D、J J、K
B
E
A
F CD
H K
G I
J
L
思考交流: 如何判断所有课程安排是否
7.6 拓扑排序
(图结构第六讲)
网络工程学院 王洪峰
遥远的距离
世界上最遥远的距离,不是从南极到北极, 而是我在讲解算法为何如此精妙,您却能够安详在课堂上睡觉。 世界上最遥远的距离,不是珠峰与马里亚纳海沟的距离, 而是我欲把古人的智慧全盘给您,您却不屑一顾毫不怜惜。 世界上最遥远的距离,不是牛A与牛C的狭小空隙, 而是您们当中,有人在通往牛逼的路上一路狂奔, 而有人步入大学校园就学会放弃……
算法性能分析
有向图G:n 个顶点 e 条边 计算入度时间:遍历所有头结点和邻接边,O(n+e) 零度顶点入栈:遍历indegree数组,O(n) 拓扑排序过程:若无环,所有顶点进一次栈、出一次栈,共n次
同时删除边时入度减1操作进行e次,O(n+e) 若有环,则时间复杂度只会比无环时要少
总的时间复杂度:O(n+e)
STEP 3:重复做直到栈S为空 STEP 3.1:弹出栈顶顶点u,保存顶点u到拓扑排序结果集,count++ STEP 3.2:针对顶点u的每条邻接边,将邻接顶点入度减1, 实时判断该邻接顶点入度,如果为0,则将其存入栈S
STEP 4:若count< G.vexnum,则图有环路,否则图无环路
7.6 拓扑排序
符合先后顺序呢?
7.6 拓扑排序
7.6 拓扑排序
思考交流: 几万个零部件,如何依据供应链状况合理安排汽车所有零部件生产工序呢?
7.6 拓扑排序
7.6 拓扑排序
工程系统顺利开展: (1)工程能否按照某种次序顺利进行?
拓扑排序
(2)能否估算整个工程完成所必须的最短时间?
关键路径
7.6 拓扑排序
增加顶点入度数组indegree,保存顶点的实时入度信息 增加零度顶点栈:避免重复检测入度为零的顶点 实时更新顶点入度:将零度顶点的所有邻接顶点入度减1
7.6 拓扑排序
计算机实现
STEP 1:遍历邻接表,计算各个顶点的入度,写入indegree数组
STEP 2:初始化:零度顶点栈S,遍历indegree数组将零度顶点入栈 定义拓扑排序输出结果中顶点统计变量count = 0
求解思路: 徒弟师傅邻接表:以徒弟编号为弧尾顶点,以师傅编号作为邻接弧头顶点 顶点入度indegree数组:记录每个人的师傅数量,即每个人的入度。 零度顶点栈S:保存师傅数量为0的徒弟编号 关系合法判断:拓扑排序过程结束,若统计变量等于人员数量,则人员关系合法; 否则不合法。
7.6 拓扑排序
案例2:比赛名次排序 HDU1285
7.6 拓扑排序
案例2:比赛名次排序 HDU1285
求解思路: 队伍输赢邻接表:以赢家编号为弧尾顶点,以输家编号作为邻接弧头顶点 顶点入度indegree数组:记录每个队伍比赛输的场次数量 零度顶点优先队列S:保存比赛输掉场次的数量为0的队伍编号,且小号优先 比赛名词排序:因输入数据确保有向无环,故拓扑排序结束直接打印结果
相关文档
最新文档