一、最小生成树
连通图:在无向图中,若从顶点v1到顶点v2有路径,则称顶点v1与顶点v2是连通的。如果图中任 意一对顶点都是连通的,则称此图为连通图。
强连通图:在有向图中,若在每一对顶点vi和vj之间都存在一条从vi到vj的路径,也存在一条从vj 到 vi的路径,则称此图是强连通图。
生成树:一个连通图的最小连通子图称作该图的生成树。有n个顶点的连通图的生成树有n个顶点 和n- 1条边连通图中的每一棵生成树,都是原图的一个极大无环子图,即从其中删去任何一条边,生成树就不在连通;反之,在其中引入任何一条新边,都会形成一条回路。生成树可能有多个。
最小生成树:所有生成树边的权值加起来最小的就是最小
若连通图由n个顶点组成,则生成树。
其生成树必含n个顶点和n-1条边。因此构造最小生成树的准则有三条:
- 只能使用图中的边来构造最小生成树
- 只能使用恰好n-1条边来连接图中的n个顶点
- 选用的n-1条边不能构成回路
构造最小生成树的方法:Kruskal算法和Prim算法。这两个算法都采用了逐步求解的贪心策略。
二、 Kruskal算法
任给一个有n个顶点的连通网络N={V,E}, 首先构造一个由这n个顶点组成、不含任何边的图G={V,NULL},其中每个顶点自成一个连通分量, 其次不断从E中取出权值最小的一条边(若有多条任取其一),若该边的两个顶点来自不同的连通分 量,则将此边加入到G中。
如此重复,直到所有顶点在同一个连通分量上为止。 核心:每次迭代时,选出一条具有最小权值,且两端点不在同一连通分量上的边,加入生成树
注意:
1.在每次选择最小权值的时候,要判断选择最小权值的节点是否会和原来的节点形成环,此时就需要使用到并查集,将已加入的节点同时加入并查集,每次找到新节点添加时,首先判断是否会添加在一个子集中,如果是一个集合,就不要这个边。
2.克鲁斯卡尔算法是一个贪心算法,生成的最小生成树所有去权并不绝对
二、Prime算法
首先选出权值最小的边,接着从已经选出的边中选出
连接边最小的,直至选出n-1个边,这样把图分成两部分:连同的和不连通的,就完美的避开了环的问题。