数据结构——图的连通性(生成树、最小生成树、生成森林)(Prim算法)(Kruskal算法)

1、求图的生成树(或生成森林)

      生成树:是一个极小连通子图,它含有图中全部n个顶点,但只有n-1条边。

      生成森林: 由若干棵生成树组成,含全部顶点,但构成这些树的边是最少的。

      深度优先搜索生成树: 由深度优先搜索得到的生成树

      广度优先搜索生成树: 由广度优先搜索得到的生成树

      若对连通图进行遍历,得到的是图的生成树

      若对非连通图进行遍历,得到的是图的生成森林

例1:画出下图的生成森林(或极小连通子图)

数据结构——图的连通性(生成树、最小生成树、生成森林)(Prim算法)(Kruskal算法)_第1张图片求解步骤:
Step1:先求出邻接矩阵或邻接表;

Step2:写出DFS或BFS结果序列;
Step3:画出对应子图或生成森林。

数据结构——图的连通性(生成树、最小生成树、生成森林)(Prim算法)(Kruskal算法)_第2张图片

2、求图的最小生成树

             n个顶点的生成树很多,需要从中选一棵代价最小的生成树,即该树各边的代价之和最小。此树便称为最小生成树MST。

目标: 在网络的多个生成树中,寻找一个各边权值之和最小的生成树。

构造最小生成树的准则

  • 必须只使用该网络中的边来构造最小生成树;
  • 必须使用且仅使用n-1条边来连接网络中的n个顶点
  • 不能使用产生回路的边。

(1)Prim(普里姆)算法

        基本思想:在图中任取一个顶点K作为开始点,令U={k}, V=W-U,其中W为图中所有顶点集,然后找一个顶点在U中,另一个顶点在V中的边中最短的一条,找到后,将该边作为最小生成树的边保存起来,并将该边顶点全部加入U集合中,并从V中删去这些顶点,然后再重复此过程,直到V为空集止。

具体实现过程:

数据结构——图的连通性(生成树、最小生成树、生成森林)(Prim算法)(Kruskal算法)_第3张图片

(1)Kruskal(克鲁斯卡尔)算法

       基本思想:将图中所有边按权值递增顺序排列,依次选取权值较小的边,但要求后面选取的边不能与前面选取的边构成回路,若构成回路,则放弃该条边,再去选后面权值较大的边, n个顶点的图中,选够n-1条边即可。

数据结构——图的连通性(生成树、最小生成树、生成森林)(Prim算法)(Kruskal算法)_第4张图片

数据结构——图的连通性(生成树、最小生成树、生成森林)(Prim算法)(Kruskal算法)_第5张图片

 

你可能感兴趣的:(C语言,数据结构)