五、图——图的应用

最小生成树

  1.定义

  权值和最小的生成树,极小连通子图,包含所有的顶点,尽可能少的边,多一条边就会构成回路,少一条边就会不连通。

  2.求法

  求最小生成树必须解决如下问题:

  1)尽可能选取权值最小的边,并且不构成回路

  2)尽可能使 n 个顶点连接 n - 1 条边连通  

  常见方法有:Prim算法和 Kruskal 算法,他们都是典型的贪心算法

  3.典型算法

  • Prim算法

  过程:始终以顶点为主导,将顶点分为 A 类和 B类,A类是加入最小生成树的顶点,B类是剩下的顶点。初始化的时候,A = {} ,B = {全部}。任意选择一个顶点开始,从起始点开始选择权值最小的边,将这条边和顶点加入最小生成树;然后以加入的顶点再找最小权值的边,跳过已经用过的和成为回路的边,直到所有的顶点。

     适用于:边稠密的,时间复杂度为 O (顶点的平方)

  • kruskal算法

  不断选取权值最下的边,并且判断加入之后不构成回路。

  适用于:顶点稠密但是边稀疏的图

  时间复杂度:用堆来存储边的集合,每次选取最小权值的边是 O (log|E|),时间复杂度是 O (E log|E|)  

  4.应用场景

  几个城市(图1)之间怎么修路,可以使整体上代价最小?

最短路径

  对于无向图来说,BFS可以查找到 非带权的单源最短路径,这是因为 BFS 总是按照距离由近到远来遍历图中顶点。

  对于有向权值图

  迪杰斯特拉算法(非负权值,单源最短路径)

  逐步将顶点纳入已求得最短路径的顶点。

  时间复杂度:O (|v|2)

  Floyd算法求各顶点之间最短路径问题(每一对点之间的最短路径,允许权值为负的边,但是不允许包含带负权值的边组成的回路)

  n阶方阵;A-1,A0......逐步加入顶点。

  Ak [ i ][ j ]表示从顶点 Vi 到顶点 Vj的路径长度,k表示绕行第 K 个顶点的运算步骤。 

拓扑排序  

  有向无环图,反映活动的前驱和后继关系的。

关键路径

  顶点表示事件,边表示活动,边上的权值表示活动开销。

  具有的性质:1)某个顶点,入这个顶点的边代表的活动都发生了,它才可以发生。

        2)这个顶点的事件发生后,以这个顶点出发的有向边代表的活动才可以发生。

  关键路径:从源点到汇点的最长路径的长度,但是它其实是完成工程的最短时间。

  求关键路径的步骤:

  1)事件Vk最早发生的时间Ve(k)

  2)   事件最晚发生时间 Vl(k)

  3)活动的最早开始时间 e(i)

  4)活动的最晚开始时间 l(i)

  5)  d(i) = l (i) - e (i),余量为0,说明活动必须要如期完成,否则会拖延整个工程的进度,它的拖延会拖延整个工程的进度

 

  

posted @ 2020-05-09 10:40  天凉好个秋秋  阅读(226)  评论(0编辑  收藏  举报