图的应用之最小生成树

210 阅读3分钟

这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

在上面在我分享关于图的基础概念中提到过极小连通子图 而最小生成树就和这个极小连通子图之间就有一定的关系。极小连通子图:包含图的所有顶点 且用的边最少。何时为最少呢 其实n个顶点至少要有n-1条边才能连起来,因此生成树则是包含图中全部顶点的一个极小连通子图。

如何构造最小生成树:

1 普利姆算法

从我的理解为:prim算法就是从顶点出发,根据选择选择的顶点集去找与其顶点相连的边中权最小的边但是在找的边中连接起来不能形成环 若形成环就找其次小的。根据这个思想吧n个顶点都连起来且有n-1条边即可。所以普利姆算法我认为抓住:从点出发去构造生成树 这个核心即可生成一个最小生成树

image.png 像这张图:

  1. 我选择从A点开始 那么我找和A点相连的边最小的即AD 所以顶点集={A,D} 边集={(A,D)}

  2. 现在在A,D两个顶点所包含的边中找边最小 且不能构成环路 即DF 顶点集={A,D,F} b边集={(A,D),(D,F)}

  3. 在A,D,F顶点中找边中找最小 且不能构成环路,选择AB, 顶点集={A,D,F,B} b边集={(A,D),(D,F),(A,B)}

  4. 在A,D,F,B中找,选择BE, 顶点集={A,D,F,B,E} b边集={(A,D),(D,F),(A,B),(B,E)}

  5. 在A,D,F,B,E中找,选择EC, 顶点集={A,D,F,B,E,C} b边集={(A,D),(D,F),(A,B),(B,E),(E,C)}

  6. 在A,D,F,B,E,G中找,选择EG, 顶点集={A,D,F,B,E,C,G} b边集={(A,D),(D,F),(A,B),(B,E),(E,G),(E,G)} 所以在生成这个最小树的过程中就是在从点出发去生成最小树 最终图是这样的: image.png

(图片来源与百度百科)

2 克鲁斯卡尔算法

我认为抓住:他是从出发,找图中最小的边,若有n个顶点,也要有n-1条边且所有顶点都要相连接 也根据上面那张图进行Kruskal算法

  1. 选择图中最小的边 且不能构成回来 有AD=5,CE=5 这里选择AD 则顶点集={A,D} 边集合={(AD)}

  2. 选择除去选了AD边外中最小的 就是CE=5 则顶点集={A,D,C,E} 边集合={(A,D),(C,E)}

  3. 再选,DF=6 则顶点集={A,D,C,E,F} 边集合={(A,D),(C,E),(D,F)}

  4. 则AB=7,BE=7 任选一个AB=7 则顶点集={A,D,C,E,F,B} 边集合={(A,D),(C,E),(D,F),(A,B)}

  5. 选则BE=7 则顶点集={A,D,C,E,F,B} 边集合={(A,D),(C,E),(D,F),(A,B),(B,E)}

  6. 选则BC=8,EF=8 但是若选择BC=8,EF=8则会构成环路

  7. 选则BD=9,EG=9 但是若选择BD=9则会构成环路 则选择EG=9 则顶点集={A,D,C,E,F,B,G} 边集合={(A,D),(C,E),(D,F),(A,B),(B,E),(E,G)}

从上面两种生成树可以看出 当是带权无向连图图的最小生成树是唯一的 但是若是非带权图则生成树可以有多种,所以最小生成树主要争对的是无向连通图而言的