数据结构-第七章图(关键路径和最短路径)

合集下载

第7章图_数据结构

第7章图_数据结构

v4
11
2013-8-7
图的概念(3)
子图——如果图G(V,E)和图G’(V’,E’),满足:V’V,E’E 则称G’为G的子图
2 1 4 3 5 6 3 5 6 1 2
v1 v2 v4 v3 v2
v1 v3 v4
v3
2013-8-7
12
图的概念(4)
路径——是顶点的序列V={Vp,Vi1,……Vin,Vq},满足(Vp,Vi1),
2013-8-7 5
本章目录
7.1 图的定义和术语 7.2 图的存储结构

7.2.1 数组表示法 7.2.2 邻接表 ( *7.2.3 十字链表 7.3.1 深度优先搜索 7.3.2 广度优先搜索 7.4.1 图的连通分量和生成树 7.4.2 最小生成树
*7.2.4 邻接多重表 )
7.3 图的遍历
连通树或无根树
无回路的图称为树或自由树 或无根树
2013-8-7
18
图的概念(8)
有向树:只有一个顶点的入度为0,其余 顶点的入度为1的有向图。
V1 V2
有向树是弱 连通的
V3
V4
2013-8-7
19
自测题
7. 下列关于无向连通图特性的叙述中,正确的是
2013-8-7
29
图的存贮结构:邻接矩阵
若顶点只是编号信息,边上信息只是有无(边),则 数组表示法可以简化为如下的邻接矩阵表示法: typedef int AdjMatrix[MAXNODE][MAXNODE];
*有n个顶点的图G=(V,{R})的邻接矩阵为n阶方阵A,其定 义如下:
1 A[i ][ j ] 0
【北方交通大学 2001 一.24 (2分)】

图的最短路径、拓扑排序和关键路径

图的最短路径、拓扑排序和关键路径

数据结构课程辅导---图的最短路径、拓扑排序和关键路径一、最短路径由图的概念可知,在一个图中,若从一顶点到另一顶点存在着一条路径(这里只讨论无回路的简单路径),则称该路径长度为该路径上所经过的边的数目,它也等于该路径上的顶点数减1。

由于从一顶点到另一顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,我们把路径长度最短(即经过的边数最少)的那条路径叫做最短路径,其路径长度叫做最短路径长度或最短距离。

上面所述的图的最短路径问题只是对无权图而言的,若图是带权图,则把从一个顶点i到图中其余任一个顶点j的一条路径上所经过边的权值之和定义为该路径的带权路径长度,从vi到vj可能不止一条路径,我们把带权路径长度最短(即其值最小)的那条路径也称作最短路径,其权值也称作最短路径长度或最短距离。

例如,在图3-1中,从v0到v4共有三条路径:{0,4},{0,1,3,4}和{0,1,2,4},其带权路径长度分别为30,23和38,可知最短路径为{0,1,3,4},最短距离为23。

图3-1 带权图和对应的邻接矩阵实际上,这两类最短路径问题可合并为一类,这只要把无权图上的每条边标上数值为1的权就归属于有权图了,所以在以后的讨论中,若不特别指明,均认为是求带权图的最短路径问题。

求图的最短路径问题用途很广。

例如,若用一个图表示城市之间的运输网,图的顶点代表城市,图上的边表示两端点对应城市之间存在着运输线,边上的权表示该运输线上的运输时间或单位重量的运费,考虑到两城市间的海拔高度不同,流水方向不同等因素,将造成来回运输时间或运费的不同,所以这种图通常是一个有向图。

如何能够使从一城市到另一城市的运输时间最短或者运费最省呢?这就是一个求两城市间的最短路径问题。

求图的最短路径问题包括两个方面:一是求图中一顶点到其余各顶点的最短路径,二是求图中每对顶点之间的最短路径。

下面分别进行讨论。

1. 从一顶点到其余各顶点的最短路径对于一个具有n个顶点和e条边的图G,从某一顶点vi(称此为源点)到其余任一顶点vj(称此为终点)的最短路径,可能是它们之间的边(i,j)或<i,j>,也可能是经过k个(1≤k≤n-2,最多经过除源点和终点之外的所有顶点)中间顶点和k+1条边所形成的路径。

数据结构课后习题答案第七章

数据结构课后习题答案第七章

第七章图(参考答案)7.1(1)邻接矩阵中非零元素的个数的一半为无向图的边数;(2)A[i][j]= =0为顶点,I 和j无边,否则j和j有边相通;(3)任一顶点I的度是第I行非0元素的个数。

7.2(1)任一顶点间均有通路,故是强连通;(2)简单路径V4 V3 V1 V2;(3)0 1 ∞ 1∞ 0 1 ∞1 ∞ 0 ∞∞∞ 1 0邻接矩阵邻接表(2)从顶点4开始的DFS序列:V5,V3,V4,V6,V2,V1(3)从顶点4开始的BFS序列:V4,V5,V3,V6,V1,V27.4(1)①adjlisttp g; vtxptr i,j; //全程变量② void dfs(vtxptr x)//从顶点x开始深度优先遍历图g。

在遍历中若发现顶点j,则说明顶点i和j间有路径。

{ visited[x]=1; //置访问标记if (y= =j){ found=1;exit(0);}//有通路,退出else { p=g[x].firstarc;//找x的第一邻接点while (p!=null){ k=p->adjvex;if (!visited[k])dfs(k);p=p->nextarc;//下一邻接点}}③ void connect_DFS (adjlisttp g)//基于图的深度优先遍历策略,本算法判断一邻接表为存储结构的图g种,是否存在顶点i //到顶点j的路径。

设 1<=i ,j<=n,i<>j.{ visited[1..n]=0;found=0;scanf (&i,&j);dfs (i);if (found) printf (” 顶点”,i,”和顶点”,j,”有路径”);else printf (” 顶点”,i,”和顶点”,j,”无路径”);}// void connect_DFS(2)宽度优先遍历全程变量,调用函数与(1)相同,下面仅写宽度优先遍历部分。

数据结构.第7章.图.4.最短路径

数据结构.第7章.图.4.最短路径
1 nil 3
3
1 nil nil
4
nil 2 nil
5
1 2 nil
nil nil nil
2



-5

0
6

0
4
nil
nil
nil
4
nil
nil
5
nil
nil
3
V1
4 8 7 1 6
V4 V3
2 -4
V5
-5
D1
P1
1 1 2 3 4 5
0 ∞ ∞
2
3 0 4
3
8 ∞ 0
4
∞ 1 ∞
5
-4 7 ∞
0 ∞ ∞
2
3 0 4
3
8 ∞ 0
4
4 1 5
5
-4 7 11
1 1 2 3 4 5
V2
2
1 nil 3
3
1 nil nil
4
2 2 2
5
1 2 2
nil nil nil
2

-1

-5

0
6
-2
0
4
nil
3
nil
4
nil
nil
5
1
nil
3
V1
4 8 7 1 6
V4 V3
2 -4
V5
-5
D4
P4
1 1 2 3 4 5
2
3 0 4
3
8 ∞ 0
4
4 1 5
5
-4 7 11
1 1 2 3 4 5
V2
2
1 nil 3

湖经数据结构 7-图

湖经数据结构 7-图

计算机科学与技术学院 软件工程系 邓沌华
基于邻接矩阵的图的深度优先遍历算法
typedef struct vertextype
void DFS (MGraph G,int v )
{ int no;
char data; }VertexType; typedef struct mgraph
{ int w;
4
8
5
6
7
是一个递归的过程,类似于树的先序遍历。
遍历结果:
1
2
4
8
5
3
6
7
计算机科学与技术学院 软件工程系 邓沌华
例 1: 1
深度优先遍历
答案一: 1
2 5 4 3 答案二: 6
2
4
8
5
6
3
7
7 8
1
2
5
8
4
7
3
6
答案三:
1 3 6 8 7 4 2 5
计算机科学与技术学院 软件工程系 邓沌华
例 2: 已知图的邻接表如下所示,根据算法,则从顶点0出 发按深度优先遍历的结点序列是 A. 0 1 3 2 C. 0 3 2 1 B. 0 2 3 1 D. 0 1 2 3 √
计算机科学与技术学院 软件工程系 邓沌华
引言 图是比线性表和树更为复杂的非线性的数据结构。 线性表:前后相继、序列;
树:层次、分支;
图:结点之间 的关系可以是任意的,任意两个数 据元素之间都可能相关。 线性表和树都可以看成是简单的图。 图的应用领域:电路网络分析、交通运输、管理 与线路的铺设、印刷电路板与集成电路的布线等; 工作的分配、工程进度的安排、课程表的制订、 关系数据库的设计等。

图_拓扑排序关键路径最短路径

图_拓扑排序关键路径最短路径
9.1静态查找表 静态查找表
6 a 5 d 4
b
1 1 e
8 7
g 4 h
2 k
c 2 4 f
a b c d e f g h k ve vl
0 0 0 0 0 0 15 14 18 6 4 5 5 7 0 11 0 7 0 18 18 18 18 18 18 18 18 18 0 6 6 8 8 10 16 14 7
事件发生时间的计算公式: 事件发生时间的计算公式: ve(源点 = 0; 源点) 源点 ; ve(j) = Max{ve(i) + dut(<i, j>)} <i,j>表示以 为弧头的弧 表示以j为弧头的弧 表示以 vl(汇点 = ve(汇点 ; 汇点) 汇点); 汇点 汇点 vl(i) = Min{vl(j) – dut(<i, k>)} <i,j>表示以 为弧尾的弧 表示以i为弧尾的弧 表示以
(2)弗洛伊德算法的基本思想是:
的所有可能存在的路径中, 从 vi 到 vj 的所有可能存在的路径中,选出一条长 度最短的路径。
可以用如下递推公式描述: 可以用如下递推公式描述: D-1[i][j]=cost[i][j] Dk [i][j]=min{Dk-1[i][j],Dk-1[i][k]+Dk-1[k][j]}(0≤k≤n-1) 其中, 中存放着序号为i的结点到序号为 其中,cost[i][j]中存放着序号为 的结点到序号为 的结点之 中存放着序号为 的结点到序号为j的结点之 表示从结点vi到结点 到结点vj的路径 间的权值 ; Dk[i][j](0≤k≤n-1) 表示从结点 到结点 的路径 上所经过的结点序号不大于k的最短路径长度 的最短路径长度。 上所经过的结点序号不大于 的最短路径长度。

图

第七章图一、选择题1、对于具有n个顶点的图,若采用邻接矩阵表示,则该矩阵的大小为()。

A. nB. n2C. n-1D. (n-1)22、如果从无向图的任一顶点出发进行一次深度优先搜索即可访问所有顶点,则该图一定是()。

A. 完全图B. 连通图C. 有回路D. 一棵树解析:在无向图中,如果从顶点v到顶点v1存在路径,则称v和v1是连通的。

完全图:若一个图的每一对不同顶点都恰有一条边相连。

3、关键路径是事件结点网络中()。

A. 从源点到汇点的最长路径B. 从源点到汇点的最短路径C. 最长的回路D. 最短的回路4、下面()可以判断出一个有向图中是否有环(回路)。

A. 广度优先遍历B. 拓扑排序C. 求最短路径D. 求关键路径5、带权有向图G用邻接矩阵A存储,则顶点i的入度等于A中()。

A. 第i行非无穷的元素之和B. 第i列非无穷的元素个数之和C. 第i行非无穷且非0的元素个数D. 第i行与第i列非无穷且非0的元素之和6、采用邻接表存储的图,其深度优先遍历类似于二叉树的()。

A. 中序遍历B. 先序遍历C. 后序遍历D. 按层次遍历7、无向图的邻接矩阵是一个()。

A. 对称矩阵B. 零矩阵C. 上三角矩阵D. 对角矩阵8、当利用大小为N的数组存储循环队列时,该队列的最大长度是()。

A. N-2B. N-1C. ND. N+1当利用大小为n的数组顺序存储一个队列时,该队列的最大长度为?解析:n+1 因为队列的头指针指向的是第一个元素的前一个结点,而不是指向第一个元素,因此队列的头指针要占用一个结点长度,所以队列的长度就是n+1;9、邻接表是图的一种()。

A. 顺序存储结构B.链式存储结构C. 索引存储结构D. 散列存储结构10、下面有向图所示的拓扑排序的结果序列是()。

A. 125634B. 516234C. 123456D. 52164313256411、在无向图中定义顶点vi与vj之间的路径为从vi到vj的一个()。

数据结构(C语言版) 第七章 图

数据结构(C语言版) 第七章 图

路径与连通性
路径、简单路径、回路(环)、简单回路
顶点之间的连通性、无向连通图、有向强连通

4/46
7.1 图的定义和术语(3)
路径与连通性
对于有向图G1
V1V3V4V1V2 是从V1 到V2 的路径, 不是简单路径;
V1V2是简单路径; V1V3V4V1V3V4V1是环,不是简单环; V1V3V4V1是简单环。
3/46
7.1 图的定义和术语(2)
有向图
弧<v,w> ∊ E (v,w ∊V),w为弧头, v为弧尾; 顶点v
邻接到顶点w,顶点w 邻接自顶点v,弧< v, w >和 顶点v、w相关联。
顶点v 的入度是以v 为弧头的弧的数目,记为ID(v); v 的出度是以v为弧尾的弧的数目,记为OD(v); v 的度是TD(v) = ID(v) + OD(v)。
}VNode, AdjList[MAX_VERTEX_NUM];
这种存储结构适合于进行first_adj(G,v) 找v的第一个邻接点的操作
邻接矩阵的方法适合存储稠密图
26/46
7.2.2 邻接表--- 链式存储结构
邻接表是一种顺序存储与链式结构相结 合的存储方式,类似于树的孩子链表。
对每个顶点建立一个单链表,第i个单链 表中的结点表示依附于顶点vi的边。
邻接矩阵
从邻接矩阵M中可以看出该图 共有( )个顶点;如果是有 向图该图共有( )条弧,如 果是无向图,则共有( )边。
AB CD
G
25/46
邻接矩阵存储的特点
无向图的邻接矩阵是对称的,对n个顶 点的无向图只需要存入下三角矩阵,即 需要n(n-1)/2个存储单元。
有向图的邻接矩阵所需要的存储单元不 一定,需要N*N个存储单元

数据结构-第7章图答案

数据结构-第7章图答案

7.3 图的遍历 从图中某个顶点出发游历图,访遍图中其余顶点, 并且使图中的每个顶点仅被访问一次的过程。 一、深度优先搜索 从图中某个顶点V0 出发,访问此顶点,然后依次 从V0的各个未被访问的邻接点出发深度优先搜索遍 历图,直至图中所有和V0有路径相通的顶点都被访 问到,若此时图中尚有顶点未被访问,则另选图中 一个未曾被访问的顶点作起始点,重复上述过程, 直至图中所有顶点都被访问到为止。
void BFSTraverse(Graph G, Status (*Visit)(int v)) { // 按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组 visited。 for (v=0; v<G.vexnum; ++v) visited[v] = FALSE; InitQueue(Q); // 置空的辅助队列Q for ( v=0; v<G.vexnum; ++v ) if ( !visited[v]) { // v尚未访问 EnQueue(Q, v); // v入队列 while (!QueueEmpty(Q)) { DeQueue(Q, u); // 队头元素出队并置为u visited[u] = TRUE; Visit(u); // 访问u for ( w=FirstAdjVex(G, u); w!=0; w=NextAdjVex(G, u, w) ) if ( ! visited[w]) EnQueue(Q, w); // u的尚未访问的邻接顶点w入队列Q
4。邻接多重表
边结点
mark ivex
顶点结点
ilink
jvex
jlink
info
data
firstedge
#define MAX_VERTEX_NUM 20 typedef emnu {unvisited, visited} VisitIf; typedef struct Ebox { VisitIf mark; // 访问标记 int ivex, jvex; // 该边依附的两个顶点的位置 struct EBox *ilink, *jlink; // 分别指向依附这两个顶点的下一条 边 InfoType *info; // 该边信息指针 } EBox; typedef struct VexBox { VertexType data; EBox *firstedge; // 指向第一条依附该顶点的边 } VexBox; typedef struct { VexBox adjmulist[MAX_VERTEX_NUM]; int vexnum, edgenum; // 无向图的当前顶点数和边数 } AMLGraph;

第七章 图

第七章 图
vertex firstin firstout
顶点结点结构
顶点值域 指针域 指针域
tailvex headvex hlink
tlink
info
弧结点结构
弧尾结点 弧头结点 指针域 指针域 弧上信息
A B
C
在十字链表中容易求 得顶点的出度和入度
0 A
0 1

2 0∧∧
1 B 2 C
2 1∧
0 2∧∧
图的遍历方法有两种: 深度优先搜索和广度优先搜索
7.3.1 深度优先搜索
按照深度方向搜索 ,它类似于树的先根遍历。 深度优先算法的基本思想是: (1)从图中某个顶点v0出发,首先访问v0。 (2)找出刚访问过的顶点vi的第一个未被访问 的邻接点,然后访问该顶点。重复此步骤,直 到当前的顶点没有未被访问的邻接点为止。 (3)返回前一个访问过的顶点,找出该顶点的 下一个未被访问的邻接点,访问该顶点。转2。
一、图的数组(邻接矩阵)存储表示 二、图的邻接表存储表示
三、有向图的十字链表存储表示 四、无向图的邻接多重表存储表示
一、图的数组(邻接矩阵)表示法
所谓邻接矩阵(Adjacency Matrix)的存 储结构,就是用一维数组存储图中顶点的信息, 用矩阵表示图中各顶点之间的邻接关系。假设 图G=(V,E)有n个确定的顶点,即V= {v0,v1,…,vn-1},则表示G中各顶点相邻关系为一 个n×n的矩阵
遍 历
DFSTraverse(G, v, Visit());
//从顶点v起深度优先遍历图G,并对每 //个顶点调用函数Visit一次且仅一次。
BFSTraverse(G, v, Visit());
//从顶点v起广度优先遍历图G,并对每 //个顶点调用函数Visit一次且仅一次。

《数据结构》第 7 章 图

《数据结构》第 7 章 图

v3
v4 v5 v4
v3
v5 v4
v3
v5 v4
v3
v5 v4
v3
v5

一个图可以有许多棵不同的生成树。 所有生成树具有以下共同特点: 生成树的顶点个数与图的顶点个数相同; 生成树是图的极小连通子图; 一个有 n 个顶点的连通图的生成树有 n-1 条边; 生成树中任意两个顶点间的路径是唯一的; 在生成树中再加一条边必然形成回路。 含 n 个顶点 n-1 条边的图不一定是生成树。
A1 = {< v1, v2>, < v1, v3>, < v3, v4>, < v4, v1>} v1 v2
有向图
v3
v4
制作:计算机科学与技术学院 徐振中
数据结构 边:若 <v, w>∈VR 必有<w, v>∈VR,则以 无序对 (v, w) 代表这两个有序对,表示 v 和 w 之 间的一条边,此时的图称为无向图。 G2 = (V2, E2) V2 = {v1, v2, v3, v4, v5}
第七章 图
E2 = {(v1, v2), (v1, v4), (v2, v3), (v2, v5) , (v3, v4), (v3, v5)} v1
G2
v3
v2
无向图
v4
v5
制作:计算机科学与技术学院 徐振中
数据结构
第七章 图
例:两个城市 A 和 B ,如果 A 和 B 之间的连线的涵义是 表示两个城市的距离,则<A, B> 和 <B, A> 是相同的, 用 (A, B) 表示。 如果 A 和 B 之间的连线的涵义是表示两城市之 间人口流动的情况,则 <A, B> 和 <B, A> 是不同的。 北京 <北京,上海> (北京,上海) <上海,北京> <北京,上海> 北京 上海 上海

图的最短路径拓扑排序和关键路径

图的最短路径拓扑排序和关键路径

数据结构课程辅导---图的最短路径、拓扑排序和关键路径一、最短路径由图的概念可知,在一个图中,若从一顶点到另一顶点存在着一条路径(这里只讨论无回路的简单路径),则称该路径长度为该路径上所经过的边的数目,它也等于该路径上的顶点数减1。

由于从一顶点到另一顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,我们把路径长度最短(即经过的边数最少)的那条路径叫做最短路径,其路径长度叫做最短路径长度或最短距离。

上面所述的图的最短路径问题只是对无权图而言的,若图是带权图,则把从一个顶点i到图中其余任一个顶点j的一条路径上所经过边的权值之和定义为该路径的带权路径长度,从v i到v j可能不止一条路径,我们把带权路径长度最短(即其值最小)的那条路径也称作最短路径,其权值也称作最短路径长度或最短距离。

例如,在图3-1中,从v0到v4共有三条路径:{0,4},{0,1,3,4}和{0,1,2,4},其带权路径长度分别为30,23和38,可知最短路径为{0,1,3,4},最短距离为23。

图3-1 带权图和对应的邻接矩阵实际上,这两类最短路径问题可合并为一类,这只要把无权图上的每条边标上数值为1的权就归属于有权图了,所以在以后的讨论中,若不特别指明,均认为是求带权图的最短路径问题。

求图的最短路径问题用途很广。

例如,若用一个图表示城市之间的运输网,图的顶点代表城市,图上的边表示两端点对应城市之间存在着运输线,边上的权表示该运输线上的运输时间或单位重量的运费,考虑到两城市间的海拔高度不同,流水方向不同等因素,将造成来回运输时间或运费的不同,所以这种图通常是一个有向图。

如何能够使从一城市到另一城市的运输时间最短或者运费最省呢?这就是一个求两城市间的最短路径问题。

求图的最短路径问题包括两个方面:一是求图中一顶点到其余各顶点的最短路径,二是求图中每对顶点之间的最短路径。

下面分别进行讨论。

1. 从一顶点到其余各顶点的最短路径对于一个具有n个顶点和e条边的图G,从某一顶点v i(称此为源点)到其余任一顶点v j(称此为终点)的最短路径,可能是它们之间的边(i,j)或<i,j>,也可能是经过k个(1≤k≤n-2,最多经过除源点和终点之外的所有顶点)中间顶点和k+1条边所形成的路径。

数据结构第17讲_最短路径_C

数据结构第17讲_最短路径_C
例:求下图AOE网的关键路径
v2
v5
v1
v4
v3
a6=3
v6
拓扑序列:V1、V3、V2、V5、V4、V6
ve(源点) = 0 ; ve(j) = Max{ ve(i) + dut(<i, j>)}
vl(汇点) = ve(汇点); vl(i) = Min { vl(j) – dut(<i, j>)}
e(s)= ve(i) l(s)= vl(j) - dut(<i,j>)
0 4 11
定义一个n阶方阵序列
60 2 3∞0
D(-1),D(0),D(1),D(2),…,D(k),…,D(n-1)
其中:
D(-1)[i][j]= arcs[i][j] D(k)[i][j]=Min { D(k-1)[i][j], D(k-1)[i][k]+ D(k-1)[k][j] }
0≤k≤n-1
2 CA
CA CAB
CA CAB
CA CAB
作业:
• 1.对下图进行拓扑排序,可得到几个不同的拓扑 序列,分别是?
7.6 最短路径
定义:
所谓最短路径问题是指:从图中找出某一顶 点(称为源点)到达另一顶点(称为终点)的路 径上各边的权值总和最小的路径。
分类:
1.从某个源点到其余各顶点的最短路径 2.所有顶点对之间的最短路径
7.6.1 从某个源点到其余各顶点的最短路径
给定带权有向图G和源点v, 求从v到G中其余 各顶点的最短路径。
D(-1) D
D(0)D(1)源自D(2)012012012012
0
0
4 11 0
4 11 0
4

数据结构:第7章 图4-拓扑排序和关键路径

数据结构:第7章 图4-拓扑排序和关键路径

拓扑排序算法
拓扑排序方法: (1)在AOV网中选一个入度为0的顶点(没有前驱) 且输出之; (2)从AOV网中删除此顶点及该顶点发出来的所 有有向边; (3)重复(1)、(2)两步,直到AOV网中所有 顶点都被输出或网中不存在入度为0的顶点。
从拓扑排序步骤可知,若在第3步中,网中所有顶 点都被输出,则表明网中无有向环,拓扑排序成功。 若仅输出部分顶点,网中已不存在入度为0的顶点, 则表明网中有有向环,拓扑排序不成功。
拓扑序列:C1--C2--C3 (3)
C12 C9 C10
C7 C8 C6
C11
拓扑序列:C1--C2--C3--C4 (4)
C7
C12
C12
C8
C8 C9 C10
C6
C9 C10
C6
C11
C11 拓扑序列:C1--C2--C3--C4--C5
(5)
拓扑序列:C1--C2--C3--C4--C5--C7 (6)
在 (b)中,我们用一种有向图来表示课程开设
拓扑排序
1.定义 给出有向图G=(V,E),对于V中的顶点的线性序列 (vi1,vi2,...,vin),如果满足如下条件:若在G中从 顶点 vi 到vj有一条路径,则在序列中顶点vi必在 顶点 vj之前;则称该序列为 G的一个拓扑序列。 构造有向图的一个拓扑序列的过程称为拓扑排序。 2.说明 (1)在AOV网中,若不存在回路,则所有活动可排成 一个线性序列,使得每个活动的所有前驱活动都排 在该活动的前面,那么该序列为拓扑序列. (2)拓扑序列不是唯一的.
2.AOV网实际意义
现代化管理中, 通常我们把计划、施工过程、生产流程、 程序流程等都当成一个工程,一个大的工程常常被划分 成许多较小的子工程,这些子工程称为活动。在整个工 程实施过程中,有些活动开始是以它的所有前序活动的 结束为先决条件的,必须在其它有关活动完成之后才能 开始,有些活动没有先决条件,可以 安排在任意时间开 始。AOV网就是一种可以形象地反映出整个工程中各个 活动之间前后关系的有向图。例如,计算机专业学生的 课程开设可看成是一个工程,每一门课程就是工程中的 活动,下页图给出了若干门所开设的课程,其中有些课 程的开设有先后关系,有些则没有先后关系,有先后关 系的课程必须按先后关系开设,如开设数据结构课程之 前必须先学完程序设计基础及离散数学,而开设离散数 学则必须先并行学完数学、程序设计基础课程。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

时间分析: O( n 2 )
#include<iostream.h>
int search(char e);//查找顶点在顺序表中的下标
#define max 20
class Arcbox{ public: int tailvex,headvex; Arcbox *hlink,*tlink;}; class VexNode{ public: char data; Arcbox *firstin,*firstout;}; class OLgraph{ };
int count=0;
int i=search(e); Arcbox *p=xlist[i].firstout; while(p){ count++; p=p->tlink;} return count;
void main(void){ char ch; OLgraph G;
G.CreateDG();
13 8 g

30
32 7 17
7. Dijkstra 算法的C语言描述 由于C/C++的下标从0开始,所以算法中作相应的改动,用NUM代表 图的顶点数 #define NUM void shortpath_dij(g[][NUM],v0) //v0为源点,值为1到NUM { for(i=0;i<NUM;i++){ set[i]=0; dist[i]=g[v0-1][i];} set[v0-1]=1; for(i=1;i<NUM;i++) { min=MAXINT; for(w=0;w<NUM;w++) if(set[w]= =0 && dist[w]<min) { v=w; min=dist[w]; } set[v]=1; for(w=0;w<NUM;w++) if(set[w]= =0 && dist[v]+g[v][w]<dist[w]) dist[w]=dist[v]+g[v][w]; }//for i } //shortpath_dij
(2)从vl(n)=ve(n)开始向源点递推(汇点的最早开始时间与最迟时间是 一致的)
10
j1
20
vl(i ) Min {vl( j ) dut( i, j )}
j
i
7
9
j2
jm
18
i, j S ,1 i n 1
其中,S是所有以i顶点为尾的弧的集合
15
求关键路径例子 活动的最早开始时间: e(i)=ve(j)
j
ai dut<j,k>
k
ve(j)和vl(j)的求法: (1)从ve(1)=0开始向汇点递推 5 7 i1 i2 9 4 6 im 10 j
ve( j ) Max {ve(i) dut( i, j )}
i
i, j T ,2 j n
其中,T是所有以j顶点为头的弧的集合
D
F G
5
10 6
ω
α
3
4
6
1
12
H
9
4
J
9
I
K
7.6 最短路径
7.6.1 从某个源点到其余各顶点的最短路径(单源最短路径问题) 1.问题的提出 用带权的有向图表示一个交通运输网,图中: 顶点——表示城市 边——表示城市间的交通联系 权——表示此线路的长度或沿此线路运输所花的时间或费用等 问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中, 各边上权值之和最小的一条路径——最短路径 2. 迪杰斯特拉(Dijkstra)算法思想 按路径长度递增次序产生最短路径 3.所需的辅助数组dist dist[i](i=1,..n)存放当前从源点V0到顶点i的最短路径长度,其初态为 弧 <v0,i>上的权值,若该弧不存在,则为无穷大。
cin>>ch; cout<<G.indegree(ch)<<endl; cout<<G.outdegree(ch)<<endl; }
4.算法实现分析 设一个集合U,存放已产生的最短路径的顶点。初始,U只包 含源点v0 15 2 第一条路:1到2、3、 4 5 5,6之一。 7 1 9 取dist[i]最小,为3,3 5 13 加到U中 4 8 第二条路:1到2、5、8、 9 6之一。而且,3加到U 3 3
20
序号 1 2 3 4
xlist[i].firstout=p;}
int OLgraph::outdegree(char e){
xlist[i].firstout=NULL;}
for( k=0;k<arcnum;++k){ lab:cin>>v>>w; i=search(v); j=search(w); if(i==-1||j==-1){ cout<<"查无此点"; goto lab;} }
1
2 5 3 a6=2 4 活动 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 e 0 0 0 6 4 5 7 7 7 16 14 6 l

7 9 8
活动的最迟开始时间: l(i)=vl(k) - dut(<j , k >)
顶点 V1 V2 V3 V4 V5 V6 V7 V8 V9
int indegree(char e);//计算e的入度
int outdegree(char e);//计算e的出度
int OLgraph::search(char e){ for(int i=0;i<vexnum;i++) if(xlist[i].data==e) return i; return -1;} int OLgraph::indegree(char e){ int count=0; int i=search(e);

6
5 6 7
∞ ∞
7
13
中后,某些顶点的dist 值应调整。
8
如果下一条最短路径 到达顶点x,则从源点到 x的中间点必定都在U中
dist值
5 4
9 20
6. Dijkstra 算法描述
图用邻接矩阵表示,设置集合U与辅助数组 9 dist, 5 源点vo图的顶点数为n。 6 g[i,j]代表<i,j>上的权; <i,j>不存在,g[i,j]就为无穷大。 2 (1) dist[i]= g[v0,i] i=1,2,….,n (2) U=[v0]; (3) 下面步骤重复n-1次 a) 选择v使得满足 dist[v]=min{ dist[u]|uU} 1 2 3 4 5 6 7 b) v加到集合U中 U=U{v} dist 13 8 30 32 c) 修改不在集合U中顶点的dist值 1 2 3 4 5 6 7 dist[w]=min{dist[w],dist[v]+g[v,w]|wU} dist 13 8 13 30 32 1 32 1 2 3 4 5 6 7 8 13 2 dist 13 8 13 30 22 20 3 1 2 3 4 5 6 7 30 9 7 5 7 dist 13 8 13 19 22 20 4 1 2 3 4 5 6 7 6 17 6 2 1 2 3 4 5 6 7 dist 13 8 13 19 21 20 5 dist 13 8 13 19 21 20
p=new Arcbox; p->tailvex=i;p->headvex=j; p->hlink=xlist[j].firstin; p->tlink=xlist[i].firstout; xlist[j].firstin=p;
for( i=0;i<vexnum;i++){
cin>>xlist[i].data; xlist[i].firstin=NULL; }
Ve 0 6 4 5 7 7 16 14 18
Vl 0 6 6 8 7 10 16 14 18
0 2 3 6 6 8 7 7 10 16 14
l-e 0 2 3 0 2 3 0 0 3 0 0
作业:列出下面AOE-网的关键路径
A
1
6
6
2
C
8 11 4
8
E
10 3 21
B
7
3
事件的最早发生时间(ve(j)):从源点到j结点的最长的 路径。意味着事件最早能够发生的时间。 事件的最迟发生时间(vl(j)):不影响工程的如期完工 ,事件j必须发生的时间。 活动ai由弧<j,k>表示,持续时间记为 dut<j,k>,则有: 活动的最早开始时间:e(i)=ve(j) 活动的最迟开始时间:l(i)=vl(k) - dut(<j , k >) 活动余量:l(i)-e(i)的差 关键活动:活动余量为0的活动 关键路径:从源点到汇点的最长的一条路径,或者全部由关键 活动构成的路径。 如何求ve(j)和vl(j)?
第七章 图
1、图的定义和术语 2、图的存储结构 3、图的遍历 4、图的连通性问题 5、有向无环图及其应用 6、最短路径
7.5.2
关键路径
1.AOE网(Activity On Edge)——带权的有向无环图,其中顶 点表示事件,弧表示活动,权表示活动持续时间。在工程上 常用来表示工程进度计划。 2.术语 源点:表示整个工程的开始点(入度为0)。 汇点:表示整个工程的结束点(出度为0)。 活动(有向边):它的权值定义为活动进行所需要的时间。方 向表示事件的优先关系。
相关文档
最新文档