一、生成树

  • 生成树:所有顶点均由边连接在一起,但不存在回路的图


图示案例

  • 假设现在有下面的一张图

C++(数据结构与算法):58--图的应用(生成树、最小生成树(Prim算法、Kruskal算法))_广度优先

  • 那么下面的3个都是上图的生成树

C++(数据结构与算法):58--图的应用(生成树、最小生成树(Prim算法、Kruskal算法))_寻找一条路径_02



生成树的性质

  • 一个图可以有许多棵不同的生成树
  • 所有生成树具有以下共同特点:
  • 生成树的顶点个数与图的顶点个数相同
  • 生成树是图的极小连通子图,去掉一条边则非连通
  • 一个有n个顶点的连通图的生成树有n-1条边
  • 在生成树中再加一条边必然形成回路
  • 生成树中任意两个顶点间的路径是唯一



注意事项

  • 一个图可以有许多棵不同的生成树,但是含有n个顶点和n-1条边的图不一定是生成树
  • 例如,假设现在有下面的一张图

C++(数据结构与算法):58--图的应用(生成树、最小生成树(Prim算法、Kruskal算法))_广度优先

  • 下面的就不是生成树,因为其不连通

C++(数据结构与算法):58--图的应用(生成树、最小生成树(Prim算法、Kruskal算法))_寻找一条路径_04


二、广度优先生成树、深度优先生成树


广度优先生成树

  • 广度优先生成树是按BFS所得到的生成树
  • 假设,现在有如下的图

C++(数据结构与算法):58--图的应用(生成树、最小生成树(Prim算法、Kruskal算法))_图的应用_05

  • 下面的3个都是上图的广度优先生成树(每一次BFS的起始顶点用阴影表示)

C++(数据结构与算法):58--图的应用(生成树、最小生成树(Prim算法、Kruskal算法))_图的应用_06



深度优先生成树

  • 深度优先生成树是按DFS所得到的生成树
  • 假设,现在有如下的图

C++(数据结构与算法):58--图的应用(生成树、最小生成树(Prim算法、Kruskal算法))_图的应用_05

  • 下面的4个都是上图的深度优先生成树(每一次DFS的起始顶点用阴影表示)

C++(数据结构与算法):58--图的应用(生成树、最小生成树(Prim算法、Kruskal算法))_连通图及其构成_08


三、最小生成树

  • 最小生成树:给定一个无向网络,在该网的所有生成树中,使得各边权值之和最小的那颗生成树称为该网的最小生成树,也叫最小代价生成树