什么是生成树: 对于一个连通图,生成树是包含图中全部顶点的一个极小连通子图
对于无向图G:
他有多个生成树:
最小生成树就是最小代价树
对于一个带权联通无向图G=(V,E),生成树不同,每棵树的权(即树种所有边上的权值之和)也可能不同。若生成树T的权为最小的,则T成为G的最小生成树。
最小生成树可能有多个,例如:
对于这三个生成树权都是5,这三个都是最小生成树。
若一个连通图本身就是一棵树,则其最小生成树就是它本身。
只有连通图才有生成树,非连通图只有连通森林
例如这个连通图的最小生成树就是本身
如何求最小生成树? 答:Prim算法和Kruskal算法
Prim算法:
从某个顶点开始构建生成树,每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止。
例如对于这样一个连通图:
构建最小生成树步骤如下:
1、从P城开始,代价最小的是到学校的边,将学校和P城相连
2、距离这个树最小距离的是矿场,将矿场连到这个树(注意是距离这个树最近的边,不是这个连通图最短的边)
当然这里也可以连接渔村,因为他们距离都是4,之前说过最小生成树不唯一
3、接着距离这个树最近的应该是渔村,连接到树
4、距离这个树最近的是农场,连接到树
5、距离最近的是电站,连接到树。所有的点都连接完成。
最小代价为1+4+2+5+3=15
Kruskal算法(克鲁斯卡尔)
每次选择一条权值最小的边,使这条边的两头联通(原本已经联通的就不选
还是对于这样一个连通图:
步骤如下:
1、首先找权值最小的边,为学校到P城的边,由于这两个点本来就没连通,因此连接
2、接着再找权值最小的边,为矿场到渔村的边,连接这两个点
3、连接农场和电站
4、此时最短的边有两个:P城和矿场,P成和渔村,哪个都可以,我在这里连接P城和矿场。
5、最后连接P城和农场。构建完成
权值也是15
Prim算法和Kruskal算法区别:
Prim算法适合边稠密的图
Kruskal算法适合边稀疏图