数据结构有向无环图及其应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0
v1
v2
1
s
3
v4 v3
2
5
4
v5
3
v6
另外增设一个存放各顶点的入度值的一维数组indegree:
indegree[0..5] 0 0 0 1 0 2 0 3 1 4 0 5
二、拓扑排序
4号顶点的入度减1 4.算法说明:为了使说明过程简单起见,我们以下 图为例: 打印G.vertices[3].data
for(i=0;i<G.vexnum;++i){ 0 1 G.vertices[0] v1 3 2 1 ^ v1 v2 p=G.vertices[i].firstarc; G.vertices[1] v2 ^ while (p){ 2 3 G.vertices[2] v3 4 1 ^ k=p->adjvex; v3 v4 ++indegree[k]; G.vertices[3] v4 4 ^ p=p->nextarc; 4 G.vertices[4] v5 ^ 5 v6 v5 } G.vertices[5] v6 4 3 ^ } 另外增设一个存放各顶点的入度值的一维数组 indegree: }//FindInDegree
0
v1
v2
1
s
3
v4 v3
2
1
3 ^
5
4
v5
3
v6
另外增设一个存放各顶点的入度值的一维数组indegree:
indegree[0..5] 0 0 0 1 0 2 0 3 1 4 0 5
二、拓扑排序
4.算法说明:为了使说明过程简单起见,我们以下 图为例:
G.vertices[0] v1 G.vertices[1] v2 ^ G.vertices[2] v3 G.vertices[3] v4 G.vertices[4] v5 ^ G.vertices[5] v6 4 3 ^ 4 4 ^ 1 ^ 3 2 1 ^
G.vertices[2] v3 G.vertices[3] v4 G.vertices[4] v5 ^ G.vertices[5] v6 4 3 ^ 4 4 ^ 1 ^
3
v4
v3
2
5 0
5
4
v5
v6
另外增设一个存放各顶点的入度值的一维数组indegree:
indegree[0..5] 0 0 2 1 1 2 2 3 3 4 0 5
另外增设一个存放各顶点的入度值的一维数组indegree:
indegree[0..5] 0 0 0 1 0 2 0 3 1 4 0 5
0 1 2 3 4 5
二、拓扑排序
4.算法说明:为了使说明过程简单起见,我们以下 图为例:
G.vertices[0] v1 G.vertices[1] v2 ^ G.vertices[2] v3 G.vertices[3] v4 G.vertices[4] v5 ^ G.vertices[5] v6 4 3 ^ 4 4 ^ 1 ^ 3 2 1 ^
课程编号
c4
课程名称
c2
c5
先修课程
c1
c1
程序设计基础
离散数学 数据结构 c3 汇编语言
无
c1 c1,c2 c1 c3,c4 c11 c5,c3
c8 c7
c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12
c11 c10
语言的设计和分析 c12 计算机组成原理 编译原理 操作系统 高等数学 线性代数 普通物理 数值分析
0
v1
v2
1
s
3
v4 v3
2
2
3
5
4
v5
v6
另外增设一个存放各顶点的入度值的一维数组indegree:
indegree[0..5] 0 0 1 1 0 2 0 3 2 4 0 5
二、拓扑排序
4.算法说明:为了使说明过程简单起见,我们以下 图为例: 打印G.vertices[2].data
G.vertices[0] v1 G.vertices[1] v2 ^ G.vertices[2] v3 G.vertices[3] v4 G.vertices[4] v5 ^ G.vertices[5] v6 4 3 ^ 4 4 ^ 1 ^ 3 2 1 ^
另外增设一个存放各顶点的入度值的一维数组indegree:
indegree[0..5] 0 0 1 1 0 2 0 3 2 4 0 5
二、拓扑排序
4.算法说明:为了使说明过程简单起见,我们以下 图为例:
G.vertices[0] v1 G.vertices[1] v2 ^ G.vertices[2] v3 G.vertices[3] v4 G.vertices[4] v5 ^ G.vertices[5] v6 4 3 ^ 4 4 ^ 1 ^ 3 2 1 ^
G.vertices[0] v1 G.vertices[1] v2 ^ G.vertices[2] v3 G.vertices[3] v4 G.vertices[4] v5 ^ G.vertices[5] v6 4 3 ^ 4 4 ^ 1 ^ 3 2 1 ^
0
v1
v2
1
s
3
v4 v3
2
2
3
5
4
v5
v6
0
v1
Baidu Nhomakorabea
v2
1
s
3
v4 v3
2
2 3
5
4
v5
v6
4号、1号顶点的入 另外增设一个存放各顶点的入度值的一维数组 indegree: 度分别减1
indegree[0..5] 0 0 1 1 0 2 0 3 2 4 0 5
二、拓扑排序
4.算法说明:为了使说明过程简单起见,我们以下 图为例:
G.vertices[0] v1 G.vertices[1] v2 ^ G.vertices[2] v3 G.vertices[3] v4 G.vertices[4] v5 ^ G.vertices[5] v6 4 3 ^ 4 4 ^ 1 ^ 3 2 1 ^
0
v1
v2
1
s
3
v4 v3
2
5
0
5
4
v5
v6
另外增设一个存放各顶点的入度值的一维数组indegree:
indegree[0..5] 0 0 2 1 1 2 2 3 3 4 0 5
二、拓扑排序
4.算法说明:为了使说明过程简单起见,我们以下 图为例: 打印G.vertices[5].data 0 1 G.vertices[0] v1 3 2 1 ^ 4号和3号顶点 v1 v2 G.vertices[1] v2 ^ 的入度分别减 1 s
0
v1
v2
1
s
3
v4 v3
2
3号、2号、1号顶 G.vertices[5] v6 4 点的入度分别减1
indegree[0..5] 0 0 2 1 1 2 1 3
5
3 ^
4
v5
0
0 5
v6
另外增设一个存放各顶点的入度值的一维数组indegree:
2 4
二、拓扑排序
4.算法说明:为了使说明过程简单起见,我们以下 图为例:
0
v1
v2
1
s
3
v4 v3
2
1
3
5
4
v5
v6
另外增设一个存放各顶点的入度值的一维数组indegree:
indegree[0..5] 0 0 0 1 0 2 0 3 1 4 0 5
二、拓扑排序
4.算法说明:为了使说明过程简单起见,我们以下 图为例: 打印G.vertices[1].data
G.vertices[0] v1 G.vertices[1] v2 ^ G.vertices[2] v3 G.vertices[3] v4 G.vertices[4] v5 ^ G.vertices[5] v6 4 4 4 ^ 1 ^ 3 2 1 ^
data
firstarc
adjvex nextarc
0
v1
v2
1
3
v4
v3
2
5
4
v5
v6
另外增设一个存放各顶点的入度值的一维数组indegree:
indegree[0..5] 0 0 2 1 1 2 2 3 3 4 0 5
二、拓扑排序
indegree一维数组初值的程序: 4.求 算法说明:为了使说明过程简单起见,我们以下 FindInDegree(ALGraph G,indegree[0..G.vexnum-1]{ 图为例:
0
v1
v2
1
s
3
v4 v3
2
5
4
v5
0
v6
另外增设一个存放各顶点的入度值的一维数组indegree:
indegree[0..5] 0 0 2 1 1 2 1 3 2 4 0 5
二、拓扑排序
4.算法说明:为了使说明过程简单起见,我们以下 图为例: 打印G.vertices[0].data
G.vertices[0] v1 G.vertices[1] v2 ^ G.vertices[2] v3 G.vertices[3] v4 G.vertices[4] v5 ^ 4 4 ^ 1 ^ 3 2 1 ^
拓扑序列: c1 c2 c3 c4 c5 c7 c9 c10 c11 c6 c12 c8
二、拓扑排序
4.算法说明:为了使说明过程简单起见,我们以下 图为例:
G.vertices[0] v1 G.vertices[1] v2 ^ G.vertices[2] v3 G.vertices[3] v4 G.vertices[4] v5 ^ G.vertices[5] v6 4 3 ^ 4 4 ^ 1 ^ 3 2 1 ^
indegree[0..5] 0 0 2 1 1 2 2 3 3 4 0 5
二、拓扑排序
拓扑排序算法思想: 4.算法说明:为了使说明过程简单起见,我们以下 ①设一个栈S,入度为0的顶点的序 图为例: 号进栈。如0,5 进栈。count=0(打 0 1 G.vertices[0] v1 3 2 1 ^ v1 v2 印顶点个数计数器)。 G.vertices[1] v2 ^ ②当栈S不空时,出栈一个元素并 2 3 打印相应顶点; count G.vertices[2] v3 4 加 1。 1 ^ v3 v4 该顶点的所有邻接点的入度减 1, G.vertices[3] v4 4 ^ 减1后入度为0的顶点的序号进栈。 4 G.vertices[4] v5 ^ 5 ③重复第二步,直至栈空时转④。 v6 v5 G.vertices[5] v6 4 3 ^ ④若count=G.vexnum,则拓扑排序 成功;否则图中必有环路,拓扑排 另外增设一个存放各顶点的入度值的一维数组indegree: 序失败。 indegree[0..5] 0 2 1 2 3 0
二、拓扑排序
4.算法说明:为了使说明过程简单起见,我们以下 图为例:
G.vertices[0] v1 G.vertices[1] v2 ^ G.vertices[2] v3 G.vertices[3] v4 G.vertices[4] v5 ^ G.vertices[5] v6 4 3 ^ 4 4 ^ 1 ^ 3 2 1 ^
一、定义
一个无环的有向图称为有向无环图,简写为 DAG(directed acycline graph)。 与有向二叉树相比,有向无环图是更一般的特 殊有向图。 实例:
有向树
有向无环图
有向图
教材179页给出了有向无环图的一个简单应用: 用有向无环图描述算术表达式。
二、拓扑排序
1.引例:现有计算机课程12门,如下表所示:
c11
c10
c8
二、拓扑排序
3.方法:
c4 c5 c2 c1 c3 c7
c12 c9 c10 c8
c6 c11
拓扑序列: c1 c2 c3 c4 c5 c7 c9 c10 c11 c6 c12 c8
二、拓扑排序
3.方法: 注意1:从某种意义下来说,拓扑排序的结果是不 唯一的。 注意2:这种以顶点表示活动的有向无环图称为活 动在顶点的网,简称AOV(Activity On Vertex Network)网。
c6
c9
c3,c6 无 c9 c9 c9,c10,c1
二、拓扑排序
2.拓扑排序:
c4 c5 c2 c1 c3 c7
c12 c9 c10 c8
c6 c11
偏序是指集合中仅有部分元素可比较大小(或先后);
全序是指集合中所有元素均可比较大小(或先后)。
二、拓扑排序
2.拓扑排序:
c4 c5 c2 c1 c3 c7
c12 c9 c10 c8
c6 c11
拓扑排序是指将一个偏序关系转化为全序关系的过程 的特殊操作。
二、拓扑排序
3.方法:
①在有向图中选择一个没有前驱(即 c4 c5 入度为0)的顶点并输出之。
c2 c7 c3 ②在有向图中删除刚刚输出的顶点及 所有以该顶点为尾的弧。 c12
c1
c9
③图中若不再有入度为0的顶点,则 结束;否则转①。 c6
G.vertices[0] v1 G.vertices[1] v2 ^ G.vertices[2] v3 G.vertices[3] v4 G.vertices[4] v5 ^ G.vertices[5] v6 4 3 ^ 4 4 ^ 1 ^ 3 2 1 ^
0
v1
v2
1
s
3
v4 v3
2
3
5
4
v5
v6