第三章:图
Part1:图的基本概念
1、图的定义
假设有一个图,记为G(Graph),其顶点的集合记为V(Vertex),其边的集合记为E(Edge),则G=(V, E).其中
V
=
{
v
1
,
v
2
,
⋯
,
v
n
}
(
n
≥
1
)
E
=
{
(
v
i
,
v
j
)
∣
1
≤
i
,
j
≤
n
}
V=\{v_1,v_2,\cdots,v_n\} (n\geq 1)\\ E=\{(v_i,v_j) | 1\leq i,j \leq n\}
V={v1,v2,⋯,vn}(n≥1)E={(vi,vj)∣1≤i,j≤n}
对于E而言则还有一些分类,如果E中的边
- 有指向性,包含了方向信息,Vi->Vj,记为<Vi, Vj>并称G为有向图
- 无指向性,则记为(Vi, Vj)并称G为无向图
2、顶点的度
- G为无向图,则顶点的度为顶点的边的数量
- G为有向图
- 出度:顶点指出的边的数量
- 入度:指向顶点的边的数量
3、连通性
- 顶点的连通:如果顶点Vi到达顶点Vj有路径存在,那么这两个顶点之间是连通的
- 图的连通1:如果对于图中的任意一对顶点之间均存在路径,则称这个图是连通的
Part2:图的存储
1、可存储2种图(有向图/无向图)的方法
设有n个顶点的图G=(V, E)
1.1 邻接矩阵
思路:采用一个一维数组存储顶点,采用一个二维数组存储边
另邻接矩阵为An*n
A
[
i
]
[
j
]
{
1
(
v
i
,
v
j
)
/
<
v
i
,
v
j
>
∈
E
0
(
v
i
,
v
j
)
/
<
v
i
,
v
j
>
∉
E
A[i][j]\left\{\begin{array}{lr} 1 \quad (vi,vj)/<vi,vj> \quad \in E \\ 0 \quad (vi,vj)/<vi,vj> \quad \notin E \end{array}\right.
A[i][j]{1(vi,vj)/<vi,vj>∈E0(vi,vj)/<vi,vj>∈/E
当G为带权图是Aij还可以表示其权重
1.2 邻接表
思路:采用一个一维数组存储顶点,每个顶点维护一条链表,记录顶点的边(无向图)/出边(有向图)
2、存储1种图的方法
接下来介绍的方法均为邻接表法1.2的扩展
2.1 十字链表法:有向图
2.2邻接多重表:无向图
Part3:图的遍历
1、深度优先
思路:尽可能深的探索一个图
2、广度优先
思路:尽可能广的探索一个图
Part4:图的应用
1、无向图的应用
1.1 最短路径:Dijkstra Algorithm(有向图和无向图均可使用)
从途中某个顶点出发到达另一个顶点,所经过的路径中权重最小的一条路径,成为最短路径。常用Dijkstra Algorithm求解
1.2 最小生成树
连通图的生成树,是包含图全部顶点,边最少,但仍然是连通的子图
最小生成树是生成树中权值最小者
1.2.1选点算法:Prim Algorithm
思路:从某一顶点开始构建,每次将代价最小(整个图)的一个顶点纳入其中,重复至无新顶点
1.2.2 选边算法:Kruskal Algorithm
思路:每次选择权值最小的一条边(如果这个边的两个顶点已经选入了,则不选),是的边的两端连通,重复至所有顶点纳入其中
2、有向图的应用
DAG(Directed Acyclic Graph):没有环的有向图
- AOV:Activity on Vertex 用顶点表示活动
- AOE:Activity on Edge 用边表示活动,顶点表示事件
2.1 DAG描述表达式
方法:
- Step1:把各个操作数不重复的拍成一排
- Step2:标出各个运算符的生效顺序
- Step3:按照顺序加入运算符,可以同时生效的运算符放在同一层
- Step4:逐层检查同层运算符是否可以合并
2.2 AOV拓扑排序
在AOV网中找到一个做事的先后顺序,由于在AOV网中顶点表示事件,故即为顶点序列
方法:选中一个没有前驱的顶点,输出;然后删除这个顶点和与之相关的边。重复该过程
2.3 AOE关键路径
2.3.1 基本概念
-
- 源点:入度为0的点
- 汇点:出度为0的点
-
关键路径:在AOE网中从源点到汇点的路径中长度最大的路径
-
在AOE网中如果有多个箭头(活动)同时指向一个顶点,那么必须这些活动均完成之后,才能进行该事件
-
-
Early
- Vertex_early(Ve):事件最早发生时间
- Edge_early(Ee):活动最早发生时间
-
Latest
- Vertex_latest:事件最晚发生时间
- Edge_latest:活动最晚发生时间
-
2.3.2 求解关键路径
即求解Ve即可
Part end:参考文献和一些说明
题目中可能会这样子的提法“保证G在任何情况下都是连通的”意思是无论怎么样用顶点和边来构建图形,这个图都是连通图。对于有n个顶点的无向图而言,要保证G在任何情况下都是连通的,其最少需要的边数可以这样子计算:另n-1个顶点之间全连接,在加上一条边到第n个顶点[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 ↩︎