[总结]数据结构真是博大精深(三)

来源:互联网 发布:友盟刷量源码 编辑:程序博客网 时间:2024/05/23 21:36

数据结构学习提纲

(最终解释权归原作者所有,侵权必究)


1、【概念】图的定义及基本术语

是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G=(V,E),G表示一个图,V是图G中的顶点的集合,E是图G中顶点之间边的集合。在图中,顶点个数不能为0,但可以没有边

结点:图中的顶点。结点间的关系:图中的连线。无向图:图中两个顶点的连线是不带方向的边,边(v,m)表示v与w互为邻接点,或说边(v,w)依附于顶点v,w,或称边(v,w)和顶点v,w相关联。v的度:和v相关联的边的数目。有向图:图中两个顶点的连线是带方向的边(称为弧),弧可以赋予有意义的值,称为权。对于弧<v,w>,称v为弧尾,w为弧头;即顶点v邻接到顶点w,或称顶点w邻接自顶点v;或称弧<v,w>和顶点v,w相关联。v的入度:以v为弧头的弧的数目。v的出度:以v为弧尾的弧的数目。v的度:v的入度与出度之和。路径:在无向图G=(V,E)中,从顶点vp到顶点vq之间的路径是一个顶点序列(vp=vi0,vi1,vi2,…,vim=vq),其中,(vij-1,vij)∈E(1≤j≤m)。若G是有向图,则路径也是有方向的,顶点序列满足< vij-1,vij >∈E。路径长度:如果是无向图,路径上边的数目是路径长度;如果是有向图,弧上有权,路径长度为路径上的权值之和,弧上无权,路径上弧的数目是路径长度。简单路径:指路径序列中顶点不重复出现的路径。简单回路:指路径序列中的第一个顶点和最后一个顶点相同的路径,而其他顶点都不相同。子图:若图G=(V,E),G’=(V’,E’),如果V’包含于V,且E’包含于E,则称图G’是G的子图。

2、【概念】图的分类

 ⑴ 根据边的方向性、边上是否有权:有向图无向图有向网无向网。

⑵ 根据边(弧)数e和顶点数n之间的关系可分为:无向完全图:对具有n个顶点的图,任意两个顶点vi和顶点vj都存在边(vi,vj),边数e=n(n-1)/2。有向完全图:对具有n个顶点的图,任意两个顶点vi和顶点vj,存在弧<vi,vj>,即边(vi,vj)和边(vj,vi)都存在,弧数e=n(n-1)。稀疏图:边(弧)数e≤nlogn。稠密图:边(弧)数e>nlogn。

3、【概念】图的连通性

⑴ 无向图的连通性

   连通性:若从顶点vi和顶点vj有路径,则称vi和vj是连通的。

   连通图:图上任意两点都是连通的。

   连通分量极大连通子图。含有极大顶点数(如果多加1个顶点,子图就不连通了)和依附于这些顶点的所有边

⑵ 有向图的连通性

   强连通性:若从顶点vi到顶点vj有路径,从顶点vj到顶点vi也存在路径,则称vi和vj是强连通的。

   强连通图:图上任意两个顶点都是强连通的。

   强连通分量:极大强连通子图。

⑶ 生成树和生成森林

   生成树:极小连通子图,包含图中的全部顶点和连接全部顶点的n-1条边。如果多一条边,就会出现回路。如果减少一条边,则必然成为非连通的,生成树不一定唯一。

   生成森林:不连通的图中存在若干个连通分量,每个连通分量对应一棵生成树,这些连通分量的生成树就组成了一个非连通图的生成森林。

4、【概念】图的邻接矩阵存储类型

⑴用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系,用两个整型变量存储图中的顶点数和边(弧)数。

⑵图的邻接矩阵定义:

typedef struct {VertexType vexs[Vnum];int arcs[Vnum][ Vnum]; int vexNum,arcNum;}MGraph;

网的邻接矩阵定义:

typedef struct{VertexType vexs[Vnum];WeightType arcs[Vnum][Vnum];intvexNum,arcNum; };

⑶邻接矩阵的特点:是一种顺序存储结构;二维数组arcs中的元素值描述了边的邻接关系及边上是否有权;无向图和无向网的邻接矩阵是对称矩阵,有向图和有向网的邻接矩阵不一定是对称矩阵;对于边(弧)个数较少的稀疏图,其邻接矩阵也稀疏,有较多的0,用二维数组存储邻接矩阵时存储空间利用率低。

⑷适合计算顶点的度,求一个点的所有邻接点插入或删除一条边(弧)。不太适合顶点的插入和删除,图的遍历等。、

5、【概念】图的邻接表表示

⑴对图中每个顶点建立一个与该顶点有邻接关系的顶点单链表用一个一维结构体数组存储顶点的值和各顶点单链表的头指针;用整型变量存储图中的顶点数边(弧)数

⑵邻接表便于求顶点的出度,不便于求顶点的入度,如果实际问题需要求顶点的入度,可以采用逆邻接表

⑶typedef struct ArcNode{int adjvex;//弧指向的顶点的位置struct ArcNode * nextArc;//指向下一条弧的指针 [WeightType info;]//边上信息,可有可无}ArcNode;//邻接表的边结点

 typedef struct VertexNode{TelemType vertex;ArcNode *firstArc;}VertexNode;//表头结点类型

 typedef struct ALGraph{VertexNodeadjlist[MAX]; int vexNum,arcNum;}ALGraph;//邻接表

⑷邻接表的特点:图的邻接表的表示不是唯一的,它与邻接点的读入顺序有关;无向图邻接表中第i个单链表中结点个数为第i个顶点的度;有向图邻接表中第i个单链表中的结点个数为第i个顶点的出度,其逆邻接表中第i个单链表中结点个数为第i个结点的入度;无向图的边数为邻接表中结点个数的一半,有向图的弧数为邻接表中结点个数;邻接表是一种顺序+链式的存储结构,当图中顶点个数较多,而边比较少时,可节省大量的存储空间

 ⑸适合计算出度,求一个顶点所有邻接点,插入删除一条边,求一个邻接点下一个邻接点。

  不太适合顶点的插入删除,顶点的入度。

6、【概念】有向图的十字链表表示

  ⑴十字链表是将有向图的邻接表和逆邻接表结合起来得到的一种链表。

  ⑵typedef struct ArcBox{int tailvex,headvex;//该弧的尾和头顶点的位置 struct ArcBox *hlink, * rlink;//分别指向下一个弧头相同和弧尾相同的弧的指针域 [InfoType *info;]//该弧相关信息的指针}ArcBox; //十字链表的结点类型

   typedef structVexNode{VertexType data; ArcBox * firstin,*firstout;//分别指向该顶点第一条入弧和第一条出弧}//VexNode; //表头结点类型

   typedefstruct{VexNode xlist[MAX]; //表头向量 int vexNum,arcNum;//顶点数和弧数}OLGraph; //十字链表类型

7、【概念】无向图的邻接多重表表示

  ⑴在图的邻接表结构中,一条边依附的两个顶点在两个不同的边链表中,需要被修改两次。如果将一条边的信息用一个结点表示,会使得对边的操作更加方便。

  ⑵typedef struct Ebox{int mark;//访问标记 intivex,jvex;//该边依附的两个顶点的位置 struct Ebox *ilink,*jlink;//分别指向依附这两个顶点的下一条边 InfoType *info;//该边信息指针}EBox; //边结点类型

   typedef structVexBox{VertexType data; EBox *firstedge;//指向依附该顶点的第一条边}VerBox;//顶点结点类型

   typedef struct{VexBoxadjmulist[MAX]; int vexNum,edgeNum;//顶点数和边数}AMLGraph;//多重邻接表类型

8、【概念】图的遍历

从图的某顶点出发,按一定的搜索路径访问所有顶点,并保证每个顶点仅被访问一次。通常采用一个标记标识某顶点是否已被访问过,设辅助数组int visit[n]。分为深度优先遍历(栈)广度优先遍历(队列)

9、【实践】图的相关操作

创建一个邻接矩阵表示的图□ 创建一个邻接表表示的图 □ 基于邻接矩阵存储结构的连通图的深度优先遍历的递归算法 □ 基于邻接矩阵存储结构的连通图深度优先遍历的非递归算法□ 基于邻接表存储结构的连通图的深度优先遍历的递归算法 □ 基于邻接表存储结构的连通图深度优先遍历的非递归算法 □ 基于邻接矩阵存储结构的连通图广度优先遍历 □基于邻接表存储结构的连通图广度优先遍历 □ 基于邻接矩阵存储结构的非连通图的深度优先遍历 □ 基于邻接表存储结构的非连通图的深度优先遍历 □ 基于邻接矩阵存储结构的非连通图的广度优先遍历□ 基于邻接表存储结构的非连通图的广度优先遍历 □ 求一条包含图中所有顶点的简单路径(哈密尔顿问题)□ 判断图中是否存在环 □ 求无向图的顶点a到i之间的简单路径 □ 求无向图的顶点vi和vj之间的最短路径 □

10、【概念】图的生成树

生成树可以保证连通分量中的全部顶点是连通的,并且边数是最少的。连通的无向图对应一棵生成树,非连通的无向图对应生成森林。图的生成树不唯一,从不同的顶点出发可得到不同的生成树;用不同的搜索方法可得到不同的生成树,如深度优先搜索生成树、广度优先搜索生成树。

对于连通网,可能存在多棵不同的生成树,它们的共同特点是包含了图中所有的n个顶点和图中的n-1条边。在这些生成树中,必定存在一棵n-1条边的权值之和是最小的生成树,称为最小生成树

11、【实践】最小生成树算法

普里姆算法(prim):最小生成树不断壮大,复杂度O(n^2),适合稠密图 □

克鲁斯卡尔算法(Kruskal):连通分量不断合并,复杂度O(eloge),e边数,适合稀疏图 □

12、【实践】最短路径算法

求从某个源点到其余各点的最短路径:穷举法 □ 迪杰斯特拉算法(Dijkstra)□ 

每一对顶点之间最短路径:每次以一个顶点为源点,重复执行dijkstra算法n次,T=O(n^3)□弗洛伊德算法(Floyd),T=O(n^3),但形式简单 □  

13、【概念】有向无环图

一个无环的有向图称为有向无环图(DAG)。

应用:有向无环图是描述含有公共子式的表达式的有效工具;有向无环图是描述一项工程或系统地进行过程控制的有效工具。 

14、【概念】拓扑排序

⑴所有的工程或者某种流程都可分为若干个小的工程或阶段,这些小的工程或阶段就称为活动。若以图中的顶点表示活动,有向边表示活动之间的优先关系,则这样的用顶点表示活动的有向图简称为AOV网

为了保证各个活动的安排顺序是合理的,对给定的AOV网应首先判定网中是否存在环。如果存在环,则表示活动之间的关系矛盾,活动安排不合理,需重新调整。检测的办法是对有向图构造其顶点的拓扑有序序列,若AOV网中所有顶点都在它的拓扑有序序列中,则该AOV网中必定不存在环。

⑵设图G是一个具有n个顶点的有向图,包含图G的所有n个顶点的一个序列是vi1,vi2…,vin,当满足下面条件时该序列称为图G的一个拓扑序列:在AOV网中,若存在一条弧<i,j>,即顶点i优先于顶点j,则在拓扑序列中顶点i一定排在顶点j的前面;对于网中原来没有优先关系的顶点i与顶点j,在拓扑序列中也建立一个先后关系,或者顶点i优先于顶点j,或者顶点j优先于i。

⑶构造拓扑序列的过程称为拓扑排序。对于任何一项工程中各个活动的安排,必须按拓扑有序序列中的顺序进行才是可行的。

⑷拓扑序列的特点:一个有向图的拓扑序列一般不唯一有向无环图一定存在拓扑序列

⑸拓扑排序算法:在有向图中选一个没有前驱的顶点且输出,从图中删除该顶点以及以该顶点为弧尾的所有弧。

15、【实践】拓扑排序算法 □

16、【概念】关键路径

AOE网是一个带权的有向无环图,其中,顶点代表事件,弧表示活动,权表示活动持续的时间。在AOE网中的一些活动可以并行地进行。AOE网中没有入度的顶点称为始点(源点),没有出度的顶点称为终点(汇点)。

⑵AOE网的性质:只有在某顶点所代表的事件发生后,从该顶点出发的各项活动才能开始;只有在进入某顶点的各项活动都结束,该顶点所代表的事件才能发生。

关键活动:影响整个工期完成期限的子工程项,关键路径上的活动都是关键活动。

  关键路径:整个工程完成的最短时间,从AOE网的源点到汇点的最长路径长度。

  只有在关键活动按期完成的基础上,才能保证整个工程按期完成。

⑷假设活动ai关联的顶点为j、k,其中ve(j)、vl(k)分别为顶点j、k的最早和最迟发生时间,ee(i)、el(i)分别为活动ai的最早开始和最迟开始时间

 事件(顶点)的最早发生时间ve(k)是指从源点开始到顶点k的最长路径长度。这个长度决定了所有从顶点k发出的活动能够开工的最早时间。即ve(k)=从源点到顶点k的最长路径长度。事件(顶点)的最迟发生时间vl(k)是指在不推迟整个工期的前提下,事件k允许的最晚发生时间,即vl(k)=从顶点k到汇点的最短路径长度。其中vl(汇点)=ve(汇点),vl(k)=min{vl(j)-weight(<k,j>)}

 假设第i条弧为<j,k>,则第i项活动(弧)ai的最早开始时间ee(i),应等于事件j的最早发生时间,即ee(i)=ve(j);假设第i条弧为<j,k>,则第i项活动(弧)ai的最晚开始时间el(i),是指在不推迟整个工期的前提下,ai必须开始的最晚时间,即el(i)=vl(k)-weight(<j,k>)

17、【实践】求关键路径

  输入顶点和弧的信息,建立其带入度的邻接表;计算每个顶点的入度;对其进行拓扑排序;排序过程中求顶点的ve[i];将得到的拓扑序列进栈;按逆拓扑序列求顶点的vl[i];计算每条弧的ee[i]和el[i],找出ee[i]==el[i]的关键活动。□

18、【实践】相关算法设计题

 ⑴教学计划编排系统□

 ⑵基于有向无环图的表达式计算□

 ⑶已知无向图采用邻接表存储方式,写出删除边(i,j)的算法 □ 增加一个顶点的算法 □

 ⑷一家石油公司在6个地点有储油罐(a,b,c,d,e,f),现要在这些储油罐之间建造若干输油管道,以便在这些储油罐之间调配石油,并顺带向沿途的客户供出。因为建造输油管十分昂贵,所以公司希望建造尽可能少的输油管。另一方面,每条输油管在向客户提供油时都会产生些利润,公司希望所产生的的总利润最大。由于各种原因,并非在任意两个储油罐之间都可以建造输油管,6个储油罐及它们之间可以建造的输油管如下图所示,顶点表示储油罐,边表示可能建造的输油管,边上的权表示相应输油管所产生的利润。假设每条输油管的建造费用都相同,编程实现为该公司设计最佳的建造输油管的方案(提示:将边上的利润值变成负数求最小生成树)。要求用普利姆算法和克鲁斯卡尔算法分别实现。□□

 ⑸在工程项目管理中,一个大的工程往往要分解成若干个子任务,这些子任务何时开工?何时完工?哪些子任务能够同时开工?怎样才能保证整个工期按期完成?□


1、【概念】图的定义及基本术语

是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G=(V,E),G表示一个图,V是图G中的顶点的集合,E是图G中顶点之间边的集合。在图中,顶点个数不能为0,但可以没有边

结点:图中的顶点。结点间的关系:图中的连线。无向图:图中两个顶点的连线是不带方向的边,边(v,m)表示v与w互为邻接点,或说边(v,w)依附于顶点v,w,或称边(v,w)和顶点v,w相关联。v的度:和v相关联的边的数目。有向图:图中两个顶点的连线是带方向的边(称为弧),弧可以赋予有意义的值,称为权。对于弧<v,w>,称v为弧尾,w为弧头;即顶点v邻接到顶点w,或称顶点w邻接自顶点v;或称弧<v,w>和顶点v,w相关联。v的入度:以v为弧头的弧的数目。v的出度:以v为弧尾的弧的数目。v的度:v的入度与出度之和。路径:在无向图G=(V,E)中,从顶点vp到顶点vq之间的路径是一个顶点序列(vp=vi0,vi1,vi2,…,vim=vq),其中,(vij-1,vij)∈E(1≤j≤m)。若G是有向图,则路径也是有方向的,顶点序列满足< vij-1,vij >∈E。路径长度:如果是无向图,路径上边的数目是路径长度;如果是有向图,弧上有权,路径长度为路径上的权值之和,弧上无权,路径上弧的数目是路径长度。简单路径:指路径序列中顶点不重复出现的路径。简单回路:指路径序列中的第一个顶点和最后一个顶点相同的路径,而其他顶点都不相同。子图:若图G=(V,E),G’=(V’,E’),如果V’包含于V,且E’包含于E,则称图G’是G的子图。

2、【概念】图的分类

 ⑴ 根据边的方向性、边上是否有权:有向图无向图有向网无向网。

⑵ 根据边(弧)数e和顶点数n之间的关系可分为:无向完全图:对具有n个顶点的图,任意两个顶点vi和顶点vj都存在边(vi,vj),边数e=n(n-1)/2。有向完全图:对具有n个顶点的图,任意两个顶点vi和顶点vj,存在弧<vi,vj>,即边(vi,vj)和边(vj,vi)都存在,弧数e=n(n-1)。稀疏图:边(弧)数e≤nlogn。稠密图:边(弧)数e>nlogn。

3、【概念】图的连通性

⑴ 无向图的连通性

   连通性:若从顶点vi和顶点vj有路径,则称vi和vj是连通的。

   连通图:图上任意两点都是连通的。

   连通分量极大连通子图。含有极大顶点数(如果多加1个顶点,子图就不连通了)和依附于这些顶点的所有边

⑵ 有向图的连通性

   强连通性:若从顶点vi到顶点vj有路径,从顶点vj到顶点vi也存在路径,则称vi和vj是强连通的。

   强连通图:图上任意两个顶点都是强连通的。

   强连通分量:极大强连通子图。

⑶ 生成树和生成森林

   生成树:极小连通子图,包含图中的全部顶点和连接全部顶点的n-1条边。如果多一条边,就会出现回路。如果减少一条边,则必然成为非连通的,生成树不一定唯一。

   生成森林:不连通的图中存在若干个连通分量,每个连通分量对应一棵生成树,这些连通分量的生成树就组成了一个非连通图的生成森林。

4、【概念】图的邻接矩阵存储类型

⑴用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系,用两个整型变量存储图中的顶点数和边(弧)数。

⑵图的邻接矩阵定义:

typedef struct {VertexType vexs[Vnum];int arcs[Vnum][ Vnum]; int vexNum,arcNum;}MGraph;

网的邻接矩阵定义:

typedef struct{VertexType vexs[Vnum];WeightType arcs[Vnum][Vnum];intvexNum,arcNum; };

⑶邻接矩阵的特点:是一种顺序存储结构;二维数组arcs中的元素值描述了边的邻接关系及边上是否有权;无向图和无向网的邻接矩阵是对称矩阵,有向图和有向网的邻接矩阵不一定是对称矩阵;对于边(弧)个数较少的稀疏图,其邻接矩阵也稀疏,有较多的0,用二维数组存储邻接矩阵时存储空间利用率低。

⑷适合计算顶点的度,求一个点的所有邻接点插入或删除一条边(弧)。不太适合顶点的插入和删除,图的遍历等。、

5、【概念】图的邻接表表示

⑴对图中每个顶点建立一个与该顶点有邻接关系的顶点单链表用一个一维结构体数组存储顶点的值和各顶点单链表的头指针;用整型变量存储图中的顶点数边(弧)数

⑵邻接表便于求顶点的出度,不便于求顶点的入度,如果实际问题需要求顶点的入度,可以采用逆邻接表

⑶typedef struct ArcNode{int adjvex;//弧指向的顶点的位置struct ArcNode * nextArc;//指向下一条弧的指针 [WeightType info;]//边上信息,可有可无}ArcNode;//邻接表的边结点

 typedef struct VertexNode{TelemType vertex;ArcNode *firstArc;}VertexNode;//表头结点类型

 typedef struct ALGraph{VertexNodeadjlist[MAX]; int vexNum,arcNum;}ALGraph;//邻接表

⑷邻接表的特点:图的邻接表的表示不是唯一的,它与邻接点的读入顺序有关;无向图邻接表中第i个单链表中结点个数为第i个顶点的度;有向图邻接表中第i个单链表中的结点个数为第i个顶点的出度,其逆邻接表中第i个单链表中结点个数为第i个结点的入度;无向图的边数为邻接表中结点个数的一半,有向图的弧数为邻接表中结点个数;邻接表是一种顺序+链式的存储结构,当图中顶点个数较多,而边比较少时,可节省大量的存储空间

 ⑸适合计算出度,求一个顶点所有邻接点,插入删除一条边,求一个邻接点下一个邻接点。

  不太适合顶点的插入删除,顶点的入度。

6、【概念】有向图的十字链表表示

  ⑴十字链表是将有向图的邻接表和逆邻接表结合起来得到的一种链表。

  ⑵typedef struct ArcBox{int tailvex,headvex;//该弧的尾和头顶点的位置 struct ArcBox *hlink, * rlink;//分别指向下一个弧头相同和弧尾相同的弧的指针域 [InfoType *info;]//该弧相关信息的指针}ArcBox; //十字链表的结点类型

   typedef structVexNode{VertexType data; ArcBox * firstin,*firstout;//分别指向该顶点第一条入弧和第一条出弧}//VexNode; //表头结点类型

   typedefstruct{VexNode xlist[MAX]; //表头向量 int vexNum,arcNum;//顶点数和弧数}OLGraph; //十字链表类型

7、【概念】无向图的邻接多重表表示

  ⑴在图的邻接表结构中,一条边依附的两个顶点在两个不同的边链表中,需要被修改两次。如果将一条边的信息用一个结点表示,会使得对边的操作更加方便。

  ⑵typedef struct Ebox{int mark;//访问标记 intivex,jvex;//该边依附的两个顶点的位置 struct Ebox *ilink,*jlink;//分别指向依附这两个顶点的下一条边 InfoType *info;//该边信息指针}EBox; //边结点类型

   typedef structVexBox{VertexType data; EBox *firstedge;//指向依附该顶点的第一条边}VerBox;//顶点结点类型

   typedef struct{VexBoxadjmulist[MAX]; int vexNum,edgeNum;//顶点数和边数}AMLGraph;//多重邻接表类型

8、【概念】图的遍历

从图的某顶点出发,按一定的搜索路径访问所有顶点,并保证每个顶点仅被访问一次。通常采用一个标记标识某顶点是否已被访问过,设辅助数组int visit[n]。分为深度优先遍历(栈)广度优先遍历(队列)

9、【实践】图的相关操作

创建一个邻接矩阵表示的图□ 创建一个邻接表表示的图 □ 基于邻接矩阵存储结构的连通图的深度优先遍历的递归算法 □ 基于邻接矩阵存储结构的连通图深度优先遍历的非递归算法□ 基于邻接表存储结构的连通图的深度优先遍历的递归算法 □ 基于邻接表存储结构的连通图深度优先遍历的非递归算法 □ 基于邻接矩阵存储结构的连通图广度优先遍历 □基于邻接表存储结构的连通图广度优先遍历 □ 基于邻接矩阵存储结构的非连通图的深度优先遍历 □ 基于邻接表存储结构的非连通图的深度优先遍历 □ 基于邻接矩阵存储结构的非连通图的广度优先遍历□ 基于邻接表存储结构的非连通图的广度优先遍历 □ 求一条包含图中所有顶点的简单路径(哈密尔顿问题)□ 判断图中是否存在环 □ 求无向图的顶点a到i之间的简单路径 □ 求无向图的顶点vi和vj之间的最短路径 □

10、【概念】图的生成树

生成树可以保证连通分量中的全部顶点是连通的,并且边数是最少的。连通的无向图对应一棵生成树,非连通的无向图对应生成森林。图的生成树不唯一,从不同的顶点出发可得到不同的生成树;用不同的搜索方法可得到不同的生成树,如深度优先搜索生成树、广度优先搜索生成树。

对于连通网,可能存在多棵不同的生成树,它们的共同特点是包含了图中所有的n个顶点和图中的n-1条边。在这些生成树中,必定存在一棵n-1条边的权值之和是最小的生成树,称为最小生成树

11、【实践】最小生成树算法

普里姆算法(prim):最小生成树不断壮大,复杂度O(n^2),适合稠密图 □

克鲁斯卡尔算法(Kruskal):连通分量不断合并,复杂度O(eloge),e边数,适合稀疏图 □

12、【实践】最短路径算法

求从某个源点到其余各点的最短路径:穷举法 □ 迪杰斯特拉算法(Dijkstra)□ 

每一对顶点之间最短路径:每次以一个顶点为源点,重复执行dijkstra算法n次,T=O(n^3)□弗洛伊德算法(Floyd),T=O(n^3),但形式简单 □  

13、【概念】有向无环图

一个无环的有向图称为有向无环图(DAG)。

应用:有向无环图是描述含有公共子式的表达式的有效工具;有向无环图是描述一项工程或系统地进行过程控制的有效工具。 

14、【概念】拓扑排序

⑴所有的工程或者某种流程都可分为若干个小的工程或阶段,这些小的工程或阶段就称为活动。若以图中的顶点表示活动,有向边表示活动之间的优先关系,则这样的用顶点表示活动的有向图简称为AOV网

为了保证各个活动的安排顺序是合理的,对给定的AOV网应首先判定网中是否存在环。如果存在环,则表示活动之间的关系矛盾,活动安排不合理,需重新调整。检测的办法是对有向图构造其顶点的拓扑有序序列,若AOV网中所有顶点都在它的拓扑有序序列中,则该AOV网中必定不存在环。

⑵设图G是一个具有n个顶点的有向图,包含图G的所有n个顶点的一个序列是vi1,vi2…,vin,当满足下面条件时该序列称为图G的一个拓扑序列:在AOV网中,若存在一条弧<i,j>,即顶点i优先于顶点j,则在拓扑序列中顶点i一定排在顶点j的前面;对于网中原来没有优先关系的顶点i与顶点j,在拓扑序列中也建立一个先后关系,或者顶点i优先于顶点j,或者顶点j优先于i。

⑶构造拓扑序列的过程称为拓扑排序。对于任何一项工程中各个活动的安排,必须按拓扑有序序列中的顺序进行才是可行的。

⑷拓扑序列的特点:一个有向图的拓扑序列一般不唯一有向无环图一定存在拓扑序列

⑸拓扑排序算法:在有向图中选一个没有前驱的顶点且输出,从图中删除该顶点以及以该顶点为弧尾的所有弧。

15、【实践】拓扑排序算法 □

16、【概念】关键路径

AOE网是一个带权的有向无环图,其中,顶点代表事件,弧表示活动,权表示活动持续的时间。在AOE网中的一些活动可以并行地进行。AOE网中没有入度的顶点称为始点(源点),没有出度的顶点称为终点(汇点)。

⑵AOE网的性质:只有在某顶点所代表的事件发生后,从该顶点出发的各项活动才能开始;只有在进入某顶点的各项活动都结束,该顶点所代表的事件才能发生。

关键活动:影响整个工期完成期限的子工程项,关键路径上的活动都是关键活动。

  关键路径:整个工程完成的最短时间,从AOE网的源点到汇点的最长路径长度。

  只有在关键活动按期完成的基础上,才能保证整个工程按期完成。

⑷假设活动ai关联的顶点为j、k,其中ve(j)、vl(k)分别为顶点j、k的最早和最迟发生时间,ee(i)、el(i)分别为活动ai的最早开始和最迟开始时间

 事件(顶点)的最早发生时间ve(k)是指从源点开始到顶点k的最长路径长度。这个长度决定了所有从顶点k发出的活动能够开工的最早时间。即ve(k)=从源点到顶点k的最长路径长度。事件(顶点)的最迟发生时间vl(k)是指在不推迟整个工期的前提下,事件k允许的最晚发生时间,即vl(k)=从顶点k到汇点的最短路径长度。其中vl(汇点)=ve(汇点),vl(k)=min{vl(j)-weight(<k,j>)}

 假设第i条弧为<j,k>,则第i项活动(弧)ai的最早开始时间ee(i),应等于事件j的最早发生时间,即ee(i)=ve(j);假设第i条弧为<j,k>,则第i项活动(弧)ai的最晚开始时间el(i),是指在不推迟整个工期的前提下,ai必须开始的最晚时间,即el(i)=vl(k)-weight(<j,k>)

17、【实践】求关键路径

  输入顶点和弧的信息,建立其带入度的邻接表;计算每个顶点的入度;对其进行拓扑排序;排序过程中求顶点的ve[i];将得到的拓扑序列进栈;按逆拓扑序列求顶点的vl[i];计算每条弧的ee[i]和el[i],找出ee[i]==el[i]的关键活动。□

18、【实践】相关算法设计题

 ⑴教学计划编排系统□

 ⑵基于有向无环图的表达式计算□

 ⑶已知无向图采用邻接表存储方式,写出删除边(i,j)的算法 □ 增加一个顶点的算法 □

 ⑷一家石油公司在6个地点有储油罐(a,b,c,d,e,f),现要在这些储油罐之间建造若干输油管道,以便在这些储油罐之间调配石油,并顺带向沿途的客户供出。因为建造输油管十分昂贵,所以公司希望建造尽可能少的输油管。另一方面,每条输油管在向客户提供油时都会产生些利润,公司希望所产生的的总利润最大。由于各种原因,并非在任意两个储油罐之间都可以建造输油管,6个储油罐及它们之间可以建造的输油管如下图所示,顶点表示储油罐,边表示可能建造的输油管,边上的权表示相应输油管所产生的利润。假设每条输油管的建造费用都相同,编程实现为该公司设计最佳的建造输油管的方案(提示:将边上的利润值变成负数求最小生成树)。要求用普利姆算法和克鲁斯卡尔算法分别实现。□□

 ⑸在工程项目管理中,一个大的工程往往要分解成若干个子任务,这些子任务何时开工?何时完工?哪些子任务能够同时开工?怎样才能保证整个工期按期完成?□