数据结构笔记——最小生成树

写在前面:科班出身,应届考研党,愿21考研成功上岸,冲冲冲!

目录

知识总览

一、生成树

二、广度优先生成树

三、深度优先生成树

四、最小生成树(最小代价树)

五、Prim算法(普里姆)

六、Kruskal算法(克鲁斯卡尔)

七、Prim算法 vs Kruskal算法

八、Prim算法的实现思想

九、Kruskal算法的实现思想

十、总结

知识总览

一、生成树

连通图生成树包含图中全部顶点的一个极小连通子图。(边尽可能的少,但要保持连通)

若图中顶点树为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条边的两个顶点是否连通(是否属于同一个集合)

十、总结

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章