最小生成树
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,说明活动必须要如期完成,否则会拖延整个工程的进度,它的拖延会拖延整个工程的进度