图的基本概念
点(顶点)
图上的一些点,每个点代表一个位置
边
连接两个点的线
权重
代表边的重要性,比如从家到学校和家到超市走的路的时间不同,这个时间就是权重
邻接
若两个点之间有一条边直接连接,则称这两个点邻接
路径
经过一系列点和边的路线
连通
在一个图中,能从任意一个点到达其他任意一个点
若要形成连通图,n个顶点最少需要n-1条边
邻接矩阵表示法
若有n个点,则矩阵为n行n列 若a到b有直接连接的边,则矩阵第a行第b列为1 否则为0
邻接表表示法
在图中的每个点都有一个列表,列表里记录了该点能直接相连的所有点
比邻接矩阵更省空间
图的储存特点
-
空间效率:
- 邻接矩阵:如果图中的点很多,但每个点的连接不多,那么邻接矩阵会占用很多空间,因为它为每一对点都保留了空间,不管它们是否直接相连。
- 邻接表:相比之下,邻接表只记录实际存在的边,所以对于那些点很多但边相对较少的图来说,它更节省空间。
-
访问效率:
- 邻接矩阵:要判断两个点是否直接相连,只需查看矩阵的对应位置即可,非常快速。
- 邻接表:要找出两个点是否直接相连,可能需要遍历其中一个点的邻接表,这在最坏的情况下可能需要更多时间。
-
添加或删除边的效率:
- 邻接矩阵:添加或删除边非常简单和快速,只需要更新矩阵的对应位置。
- 邻接表:添加边相对容易,但删除边可能需要遍历列表来找到并移除边。
-
适用场景:
- 邻接矩阵适合于边的数量接近点的数量平方的图,也就是所谓的“稠密图”。
- 邻接表适合于边的数量远小于点的数量平方的图,也就是“稀疏图”。
-
直观性:
- 邻接矩阵直观地表示了所有点之间的关系,容易理解和展示。
- 邻接表更抽象一些,需要一定的理解才能看出整个图的结构。
DFS(深度优先搜索)
一条路先走到头,走到不能走了为止,然后回到上一个点寻找有没有还能走的路,没有就继续回溯,如果有就也是一条路走到头,然后回溯
BFS(广度优先搜索)
从起点开始,搜索周围所有的点,然后一层层一下去,像是扩散开一样
最小生成树
是一个边为n-1的带权连通图
克鲁斯卡尔算法
先把所有的边按权重从小到大排序,从最小的边开始,依次考虑,若加入这条边不会形成环,则加入最小生成树中
普利姆算法
选一个顶点作为起点,然后从已选的顶点中找到一条权重最小的边,连上去,这样就能连到一个新的节点,不断重复 直到所有的点都连上 也是不能形成环
若边非常多时,普利姆算法可能好点,边少的时候克鲁斯卡尔算法好点
有向无环图(DAG)
拓扑排序
把顶点排成线性序列的方法
一张图拓扑排序可能会有好多好多种序列(不唯一)
我的方法:
找到一个没有入度的节点,然后把它加到序列里,然后把这个点和这个点连着的边删了,再找图中没有入度的节点,加到序列里,然后再删,不断重复,直到所有点都加入序列了
AOV网
用来表示顶点之间先后顺序的有向图
使用AOV网的主要目的就是用来拓扑排序
举个栗子
- 每个活动(比如布置会场、彩排节目、准备食物)都是图中的一个顶点。
- 如果一个活动必须在另一个活动之前完成,那么图中就会有一条从后一个活动指向前一个活动的有向边。
关键路径
指的是完成一个项目所需的最长时间路径。这条路径上的任务是项目成功的决定性因素,因为任何这些任务的延迟都会直接导致整个项目的延迟。即带权图中权值累加最长的路径。
关键路径的特点:
-
最长持续时间的路径:关键路径是项目中所有路径中耗时最长的一条。它决定了项目的最短完成时间。
-
不容许延误的任务:关键路径上的任务没有时间上的弹性,即它们的延误将直接影响整个项目的完成日期。
-
关键任务的识别:关键路径分析帮助项目经理识别哪些任务是关键任务,这些任务需要特别关注,以确保项目按时完成。
-
浮动时间为零:关键路径上的任务通常没有浮动时间(Slack Time),即没有可用的额外时间来延迟任务,而不影响项目的整体进度。
AOE网
是一种用来表示项目活动和事件之间依赖关系的有向图。在AOE网中,图的每条边代表一个活动或任务,而顶点则表示事件,即活动的开始或结束点。这种表示方法主要用于项目管理中的关键路径方法,帮助分析项目中任务的时序关系和持续时间。
- 顶点(Vertex):代表项目中的关键事件,如任务的开始或完成。每个顶点都可以理解为一个时间点,比如项目的开始、某个任务的结束等。
- 边(Edge):表示从一个事件到另一个事件之间的活动或任务。每条边上通常会标记该活动的持续时间。
举个栗子
比如,在建筑一个房子的项目中:
- 一个顶点可能代表“地基挖掘完成”,另一个顶点可能代表“地基浇筑完成”。
- 这两个顶点之间的边代表“浇筑地基”的活动,边上可能标有这个活动需要的天数。
AOE网的一个重要用途是确定项目的关键路径。关键路径是从项目开始到结束所经过的最长路径,决定了项目的最短完成时间。
最短路径
从一个起点到终点的边的权重和最小的路径
迪杰斯特拉算法
适用于没有负权边的图。这个算法从起点开始,逐步扩展到图中的所有点,每次选择距离起点最近的一个未被访问的顶点,并更新其他顶点的最短路径。
ford算法
适用于包含负权边的图。这个算法通过对所有边进行多次松弛操作(尝试更新最短路径的估计值),来逐步找到真正的最短路径。
弗洛伊德算法
用于找到所有顶点对之间的最短路径。通过动态规划的方法,逐步构建每对顶点间的最短路径。