写在前面:科班出身,应届考研党,愿21考研成功上岸,冲冲冲!
目录
知识总览
一、生成树
连通图的生成树是包含图中全部顶点的一个极小连通子图。(边尽可能的少,但要保持连通)
若图中顶点树为n,则它的生成树含有n-1条边。对生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路。
二、广度优先生成树
三、深度优先生成树
四、最小生成树(最小代价树)
道路规划要求:所有地方都连通,且成本尽可能的低
对于一个带权连通无向图G=(V,E),生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。设R为G的所有生成树的集合,若T为R中边的权值之和最小的生成树,则T成为G的最小生成树。
注
①最小生成树可能有多个,但边的权值之和总是唯一且最小的。
②最小生成树的边数= 顶点树- 1。砍掉一条则不连通,增加一条边则会出现回路。
③如果一个连通图本身就是一棵树,则其最小生成树就是它本身
④只有连通图才有生成树,非连通图只有生成森林
五、Prim算法(普里姆)
从某一个顶点开始构建生成树;每次将代价最小的新顶点纳入生成树,知道所有顶点的纳入为止。
六、Kruskal算法(克鲁斯卡尔)
每次选择一条权值最小的边,使这条边的两头连通(原本已经连通的就不选),直到所有结点都连通
七、Prim算法 vs Kruskal算法
Prim:
从某一个顶点开始构建生成树;每次将代价最小的新顶点纳入生成树,知道所有顶点的纳入为止。
时间复杂度:O(|V|^2),适合用于边稠密图
Kruskal:
每次选择一条权值最小的边,使这条边的两头连通(原本已经连通的就不选),直到所有结点都连通
时间复杂度:O(|E|log2|E|)适合用于边稀疏图
八、Prim算法的实现思想
初始:从V0开始
第1轮:循环遍历所有个结点,找到lowCost最低的,且还没加入树的顶点
再次循环遍历,更新还没加入的各个顶点的lowCost值
第2轮:循环遍历所有个结点,找到lowCost最低的,且还没加入树的顶点
第3轮:循环遍历所有个结点,找到lowCost最低的,且还没加入树的顶点
第4轮:循环遍历所有个结点,找到lowCost最低的,且还没加入树的顶点
第5轮:循环遍历所有个结点,找到lowCost最低的,且还没加入树的顶点
九、Kruskal算法的实现思想
初始:将各条边按权值排序
第1轮:检查第1条边的两个顶点是否连通(是否属于同一个集合),不连通,连起来
第2轮:检查第2条边的两个顶点是否连通(是否属于同一个集合)
第3轮:检查第3条边的两个顶点是否连通(是否属于同一个集合)
第4轮:检查第4条边的两个顶点是否连通(是否属于同一个集合)
第5轮:检查第5条边的两个顶点是否连通(是否属于同一个集合),已连通,跳过
第6轮:检查第6条边的两个顶点是否连通(是否属于同一个集合)