最小生成树算法:
Prim算法:从某一个顶点开始构建生成树;每次讲代价最小的新顶点纳入生成树,知道所有顶点度纳入为止
Kruskal算法:每次选择一条权值最小的边,使这条边的俩头联通(原本联通的不选)知道所有结点都连通
比较适用场景:
最短路径处理:
BFS求无权图的单源最短路径:对于广度优先算法是新增了最短路径长度 d[]和 path[]前驱结点
BFS算法局限性:不适用带权值路径长度(适用权值相等或无边)
Dijkstra最短路径算法:
初始化:
final[]标记各顶点是否已找到最短路径:V0初始化为 true其他结点为 false
dist[]最短路径长度:当前结点到各个节点的最短路径(不相邻的设为无穷大)
path[]路径上的前驱:每个顶点在最短路径上的直接前驱(目前找到最好的路径结点)
第一轮:循环遍历所有结点,找到还没确定最短路径,即 dist最小的顶点Vi,令 final[i]=true
检测所有邻结自 Vi的顶点,若其 final的值为 false,则更新 dist和 path的信息(邻结点未找到最短路径的节点,根据此节点的权值加上至起始节点 V0的权值总和是否少于 dist[]记录最短路径的值,则更新 dist的值和 path至此结点的前驱结点)
第二轮:中间继续循环遍历所有结点,找到还没确定最短路径,且 dist最小的顶点 Vi,使 final[i] = ture
Dijkstra时间复杂度:
Dijkstra算法局限:不适用于负权值的带权图(Dijkstra算法无法处理带有负权值的边的图。这是因为如果存在负权边,就有可能出现路径更新的环路,导致算法无法正确求解最短路径)
Floyd算法:计算每一对顶点之间的最短路径
Floyd算法核心代码:
Floyd算法用于负权图:
Floyd算法的局限是:有不能处理带负权回路的图
有向无环图:
DAG描述表达式:
解题方式:(有向无环图存储结果不唯一)
Step:把各个操作数不重复的排成一排(后续合并的时候只有同层的才能合并)
Step:标出各个运算符的生效顺序(先后顺序有点出入无所谓)
Step:按顺序加入运算符,注意分层
Step:从底层向上逐层检测同层的运算符是否可以合体
拓扑排序:
AOV网:一定是有向无环图
拓扑排序实现:
Step:从 AOV网中选择一个没有前驱(入度为 0)的顶点并输出(如果原图存在环则会有 入度大于0情况)
Step:从网中删除该顶点和所有以他为起点的有向边
Step:重复 1,2直至当前的 AOV网为空或当前网中不存在无前驱的顶点为止
对有回路的图进行拓扑排序:
逆拓扑排序:
逆拓扑排序的实现:
总结:
AOE网:
有 AOE网中仅有一个度为 0的顶点,称为开始定点
且仅有一个出度为 0的结束顶点
关键路径:从原点至汇点的所有路径中,具有最大路径长度的称关键路径,其上的活动称关键活动
时间余量为 0的活动为关键活动
所有时间的最早发生事件:
各事件的最迟发生时间:后继结点的最迟发生时间减事假间去边的权值时间
计算所有时间的最早发生时间:
计算所有活动的最早发生时间: e(i)=ve(k)前驱结点最小的时间结点
所有活动的最迟发生时间:这个结点的前驱结点减去这俩个事件的权值
总结: