图的后面几章内容概述(自用)
图的应用
最小生成树 MST
生成树的概念:连通图的生成树是包含图中全部顶点的一个极小连通子图(即顶点数为n,生成树的边只有n-1个)
广度优先生成树
深度优先生成树
最小生成树的概念:边的权值之和最小的生成树
Prim算法(不唯一):从某一个顶点开始构建生成树;每次讲代价最小的新顶点纳入生成树,直到所有的顶点纳入,即以点为基础构建图
实现:两个数组 1是否加入数组
2纪录各节点加入树的最低代价(需要循环遍历,更新还没有加入的结点的lowcast的值)
加一次顶点就要把所有的lowcast更新一遍
适合稀疏图
时间复杂度:v2
Kruskal算法:每次都选权值最小的一条边时期两头相连,已经连过的就不选,直到所有点都连通,即以边构建图
适合稠密图
实现:先把所有边按权值递增的顺序排序,遍历所有边e,每当处理一条边时用并查集判断两节点是否相连log2e
时间复杂度:elog2e
图的应用2——最短路径
概念:1、单源最短路径
2、每对顶点的最短路径
1、单源最短路径
单源最短路径:1、无权图——BFS算法(广度优先)
实现:BFS加一个纪录顶点到各点的最短路径和纪录前驱的表
局限性(不适合带权图的算法)
dijkstra最短路径算法:
实现:建立一个表(有三个元素,标记结点是否找到最短路径final,最短路径长度dist,路径的直接前驱path)
先找出和目标节点相邻的结点并记录d和p,然后循环遍历令最短路径的f变为true,然后再找路径相连的节点的dp,再循环知道f权威true
注意:dijkstra不适用与负权值算法
2、每对顶点的最短路径
Floyd算法:动态规划思想,把大步骤分成小步骤来解决
初始:需要一个邻接表纪录最短带权路径长度和一个矩阵纪录每个点的直接前驱
设不允许有中转的情况下,纪录每个点之间的带权长度
设加入一个点作为中转,纪录每个点之间的最短路径长度
一直到n个点全部作为中转,且最短路劲长度和直接前驱记录完毕,算法结束
可以用来解决负权值算法
but:不能解决负权值回路
有向无环图
有向无环图(DAG)
1、描述表达式的树进行合并删减形成了有向无环图
2、拓扑排序:找到做事的先后顺序
AOV网用DAG图表示一个工程。顶点表示活动
实现:声明两个数组:一个记录当前顶点的入度,一个记录拓扑序列(初始值为-1)
创建栈/队列,所有入度为0的点入栈,输出记录
然后把入站的顶点的边所对应的点的入度减1,
重复操作,知道当前的aov网为空或者不存在无前驱的顶点为止
逆拓扑排序
关键路径——有最大路径长度的路径称为关键路径 关键活动则是关键路径上的活动
AOE网——顶点表示时间,有向边表示活动,边上的权值表示完成该活动的开销
求关键路径实现:
1求事件发生的最早,最晚发生时间
2求活动发生的最早,最晚发生时间
2求活动余量