Transcript Document
预习内容和重点
拓扑排序(能说出拓扑排序的算法思想、
能根据要求写出拓扑排序的序列、理解
拓扑排序的算法实现)
关键路径(相关概念、掌握关键路径的
算法思想、能求出关键路径)
最短路径(能说出Dijkstra求解最短路
径的算法思想、理解Dijkstra求解最短
路径的算法实现)
回答问题1
什么是有向无环图(DAG)?下图是不是
DAG?有向无环图有何用途?
A
B
C
D
G1
回答问题2
假设以有向图表示一个工程的施工图或程
序的流程图,则程序中能否出现回路?
回答问题3
如何检查有向图中是否存在回路?
A
B
C8
C9
C1
C7
C3
C4
C
D
G1
C2
C6
C5
回答问题4
何谓拓扑排序?
V2
V1
V4
V1
V2 V3
V4
V3
换句话说:对有向图进行如下操作,按照
有向图给出的次序关系,将图中的顶点排成一
个线性序列,对于没有限定次序关系的顶点,
则可以人为加上任意的次序关系。
回答问题5
如何进行拓扑排序?
A
B
C8
C9
C1
C7
C3
C4
C2
C
D
C6
C5
G1
检测一个有向图是否存在回路的方法:对有向图构
造其顶点的拓扑有序序列,若图中所有顶点都在它的拓
扑有序序列中,则该图中必定不存在环。
回答问题6
有向图的拓扑有序序列是否唯一?
C8
C9
C1
C7
C3
C4
C2
C6
C5
回答问题7
如何在计算机内实现有向图的拓扑排序?
分析:
(1)拓扑排序最关键的操作是什么?
(2)图的存储结构?
(3)如何处理多个入度为0的顶点?
拓扑排序算法实现
实现拓扑排序的算法基础
存贮结构:假设有向图以邻接表的形式存储
操作过程:
将所有入度为0的顶点入栈;
当栈非空时重复执行下列操作:
从栈中退出顶点k;
(1)将k顶点的信息输出;
(2)将与k邻接的所有顶点的入度减1。
回答问题8
对课本中的拓扑排序实现算法还可怎么改
变?
回答问题9
按照课本中的拓扑排序实现算法,写出下图的拓
扑有序序列。
degree data adj vex link
C0
1
3 0
1
C1
5
3
C2
1
5 0
0
C3 0
1
0
1
5 0
C4
0
C5 0
C0
C1
C2
3
C3
C4
C5
回答问题10
拓扑排序算法的时间复杂度是多少?
如果给定的有向图有n个顶点和e条边,那
么求各顶点入度的时间为O(e),在拓
扑排序的过程中,查找入度为零的顶点
的时间为O(n),顶点进栈及退栈输出
共执行n次,入度减1的操作执行e次,
所以,总的执行时间为O(n+e)。
回答问题11
什么是AOV网?
C8
C9
C1
C7
C3
C4
C2
C6
C5
回答问题12
什么是AOE网? 有什么用?
回答问题13
什么是源点、 汇点、 关键路径、
关键活动?
v1
6
v0
源点
1
4
5
v3
1
8
v4
v6
4
v7
2
4
v5
2
v8
7
v2
汇点
回答问题14
如何求关键路径?如何求关键活动?
2
a1=3
5
a8=1
a3=2
1
a2=2
a4=3
4
a7=2
a5=4
a6=3
3
6
顶点 Ve
V1
活动
e
l
1-e
V1
0
0
a1
0
1
1
V2
3
4
a2
0
0
0
V3
2
2
a3
3
4
1
V4
6
6
a4
3
4
1
V5
6
7
a5
2
2
0
V6
8
8
a6
2
5
3
a7
6
6
0
a8
6
7
1
正推 倒推
根据上表,l[s]-e[s]等于0的活动有
a2,a5,a7,因此a2,a5,a7为关键活动。
回答问题15
如何做才能真正缩短工期?
用AOE网来估算某些工程的时间是非常有用的,关
键活动的速度的提高是有限的,只有在不改变网
的关键路径的前提下,提高关键活动的效率才有
效,关键活动受诸多方面的影响,如果某个条件
改变可,可能会改变关键活动.
如果网中有多条关键路径,要提高整个工期的速
度,则要同时提高在几条关键路径上的活动的效
率.
回答问题16
如果从图中某一顶点(称为源点)到达另一
顶点(称为终点)的路径可能不止一条,如何找到
一条路径使得沿此路径上各边上的权值总和达到
最小?如下图从顶点V1到V7的最短路径是?
15
9
v1
4
v3
6
12
v2
5
v4
8
v5
3
11
v6
2
v7
回答问题17
迪杰斯特拉算法的算法思想是什么?
可求出从某个源点到其余各顶点的最短路径
按路径长度递增的次序产生最短路径.即
首先求出长度最短的一条最短路径,再参照
它求出长度次短的一条最短路径,依次类推,
直到从顶点v到其它各顶点的最短路径全部
求出为止.
回答问题18
按照迪杰斯特拉算法求出从顶点V0到其他各顶点的
最短路径?
V0
8
30
32
13
V1
V2
5
V3
6
V4
9
2
V5
7
V6
17
最短路径
<V0,V2>
<V0,V1>
<V0,V2,V3>
<V0,V2,V3,V4>
<V0,V1,V6>
长度
8
13
13
19
20
<V0,V2,V3,V4,V5> 21
回答问题18
如何实现迪杰斯特拉算法?
首先引入一个辅助向量D,它的分量D[i]表示当前
所有找到的从始点V到每个终点Vi的最短路径的长度。
其初态为:若从V到Vi有弧,则D[i]为弧上的权值,否
则为无穷大;显然,长度为
D[j]=Min{D[i]| Vi V}
的路径是从V出发的最短一条路径,此路径为(V, Vj )。
下一条次短的路径可通过下面的算法求得:
设次短路径的终点是Vk ,则这条路径或者是(V,
Vk ) ,或者是(V, Vj, Vk ) 。其长度或者是从V到Vk的
弧上的权值,或者是D(j)和从Vj到Vk的弧上的权值之
和。
二、算法描述:
1、用邻接矩阵arcs表示带权有向图,
arcs[i][j]表示弧< Vi ,Vj>上的权值。若弧不
存在,则置为无穷大。S为已找到从V出发的
最短路径的终点的集合,它的初始状态为空集。
那么,从V出发到图上其余各顶点(终点)Vi
可能达到的最短路径长度的初值为:
D[i]=arcs[V的序号,i]
Vi V
2、选择Vj使得,
D(j)=Min{D[i] | ViV- S}
Vj就是当前求得得一条从V出发得的最短路径
的终点。令
S=S{j}
3、修改从V出发到到集合V-S上任一顶点Vk 可达
到的最短路径长度。如果:
D(j)+ arcs[j][k]< D[k]
则修改D[k]为
D[k]= D[j]+ arcs[j][k]
4、重复2,3步共n-1次。由此求得从V到图上其余
顶点得最短路径是依路径长度递增的序列。
例:有向图如下图,求V0到其它各顶点的最短路径。
解: 根据上面的算法,其求解过程如下表所示。
终点
5
60
100
0
30
10
4
10 20
1
3
5
50
2
从V0到各终点的弧值和最短路径
V1
V2
10
(V0,V2)
60
50
(V0,V2,V3)(V0,V4,V3)
30
30
V4
(V0,V4) (V0,V4)
100
100
90
60
V5
(V0,V5) (V0,V5) (V0,V4,V5)(V0,V4,V3 ,V5)
V3
Vj
V2
V4
V3
V5
第八章
最短路径
有向图的应用
应用
小结
Dijkstra算法
Floyd算法
拓扑排序
DAG图
关键路径
存储结构
图
遍
历
邻接矩阵
邻 接 表
十字链表
邻接多重表
深度优先搜索
广度优先搜索
图的连通分量 (利用DFS)
无向图的应用
图的生成树
最小生成树
Prim算法
Kruskal算法
下节课学习内容和重点
查找(相关概念、理解各种静态查找表
查找方法、掌握顺序表查找、折半查找
的实现算法及其性能分析)