1、十字链表,将邻接表与逆邻接表结合起来。
顶点表结点结构:
Data | Firstin | Firstout |
数据 | 入边表头指针 | 出边表头指针
|
边表结点结构:
Tailvex | Headvex | Headlink | Taillink |
弧起点,在顶点表的下标 | 弧终点,在顶点表的下标 | 入边表指针域 | 边表指针域 |
2、邻接多重表
边表结点结构:
Ivex | Ilink | Jvex | Jlink |
Ivex和jvex是与某条边依附的两个顶点在顶点表中的下标,ilink指向依附顶点ivex的下一条边,jlink指向依附顶点jvex的下一条边。
3、边集数组
边数组结构:
Begin | End | Weight |
4、图的遍历有两种遍历方案:深度优先遍历(深度优先搜索DFS)和广度优先遍历(广度优先搜索BFS)。
5、深度:从图中某个顶点出发,并访问,然后未被访问的邻接点出发深度优化遍历图,直到全被访问,若有尚未被访问的,选择图中未曾被访问的顶点做起始点重复上述过程(邻接矩阵和邻接表的代码,241页)。
6、N个顶点e条边,邻接矩阵O(n^2),邻接表O(n+e),对于稀疏图来说,邻接表效率更高。
7、广度:类似于树的层序遍历,变形,一层一层入队列,一个一个出队列。(邻接矩阵和邻接表的代码,243页)。
8、最小生成树,代价最小,权值和最小。
9、普里姆算法,先做出邻接矩阵,找出代价最小的边,必有n-1条边。(代码在248面)。
10、克鲁斯卡尔算法,先做出边集数组,按权值从小到大排列,不让形成环路选出最代价最小的即可。(代码252)。
11、最短路径,源点(起点)到终点经过的边上权值之和最小的路径。
12、迪杰斯特拉算法,一步一步求最短,以上一步的最短做基础。(代码261)。
13、弗洛伊德算法,有两个二维数组,D:顶点到顶点的最短距离。P:对应顶点的最小路径的前驱矩阵(所有顶点到所有顶点的最短)。
D0 [v][w]= min{ D-1 [v][w],D-1 [v][0] + D-1 [0][w] }
K=0,代表经过v0中转,取小(代码269)。
14、拓扑排序,有向图,顶点表示活动,弧表示优先关系,称为AOV网(不能存在回路)。
15、从顶点vi到顶点vj有一条路径,则在顶点序列中顶点vi必须在顶点vj之前,这个序列称拓扑序列。
16、拓扑排序算法,从AOV网中选择一个入度为0的顶点输出,然后删去此顶点,并删除此顶点为尾的弧,直到输出全部顶点。
邻接表结构:
In | Data | Firstedge |
入度 | 数据 | 指针域 |
需要栈来存储处理过程中入度为0的顶点(代码274)。
17、关键路径,带权有向图,顶点表示时间,有向边表示活动,边上的权值表示活动的持续时间,称为AOE网。
18、路径上各个活动所坚持的时间之和称为路径长度。
从源点到汇点具有最大的长度的路径叫关键路径。
在关键路径上的活动叫关键活动。
19、关键路径算法原理:
(1)事件的最早发生时间etv:即顶点v的最早发生时间。
(2)事件的最晚发生时间ltv:即顶点v的最晚发生时间。
(3)活动的最早开工时间ete:即弧a 的最早发生时间。
(4)活动的最晚开工时间lte:即弧a 的最晚发生时间。
20、关键路径算法,取最大(代码281)。