C++(数据结构与算法):58--图的应用(生成树、最小生成树(Prim算法、Kruskal算法))
原创
©著作权归作者所有:来自51CTO博客作者董哥的黑板报的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、生成树
- 生成树:所有顶点均由边连接在一起,但不存在回路的图
图示案例
生成树的性质
- 一个图可以有许多棵不同的生成树
- 所有生成树具有以下共同特点:
- 生成树的顶点个数与图的顶点个数相同
- 生成树是图的极小连通子图,去掉一条边则非连通
- 一个有n个顶点的连通图的生成树有n-1条边
- 在生成树中再加一条边必然形成回路
- 生成树中任意两个顶点间的路径是唯一的
注意事项
- 一个图可以有许多棵不同的生成树,但是含有n个顶点和n-1条边的图不一定是生成树
- 例如,假设现在有下面的一张图
二、广度优先生成树、深度优先生成树
广度优先生成树
- 广度优先生成树是按BFS所得到的生成树
- 假设,现在有如下的图
- 下面的3个都是上图的广度优先生成树(每一次BFS的起始顶点用阴影表示)
深度优先生成树
- 深度优先生成树是按DFS所得到的生成树
- 假设,现在有如下的图
- 下面的4个都是上图的深度优先生成树(每一次DFS的起始顶点用阴影表示)
三、最小生成树
- 最小生成树:给定一个无向网络,在该网的所有生成树中,使得各边权值之和最小的那颗生成树称为该网的最小生成树,也叫最小代价生成树