数据结构知识整理15树结构与普里姆(Prim)算法及克鲁斯卡尔(Kruskal)算法

生成树和最小生成树

一个连通图的生成树是该连通图的一个极小连通子图,它含有图中全部顶点,但只有构成一棵树的(n-1)条边。如果在一棵生成树上添加一条边,必定构成一个环,因为这条边使得它依附的那两个顶点之间有了第2条路径。一颗有n个顶点的生成树(连通无向图)有且仅有(n-1)条边,但是,有(n-1)条边的图不一定都是生成树。一个图有n个顶点,如果边小于(n-1)条,则是非连通图;若边大于(n-1)条,则一定有回路。

对于一个带权(假定权值均大于0)连通无向图G中的不同生成树,各棵树的边上的权值之和可能不同,边上的权值之和最小的树称为该图的最小生成树

按照生成树的定义,n个顶点的连通图的生成树有n个顶点、n-1条边。因此构造最小生成树的准则有3条:

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

求最小生成树的用途:交通工程造价最优问题求解

无向图的连通分量和生成树:对于非连通图,每次调用遍历过程得到的顶点集连同相关的边就构成图的一个连通分量

设G=(V,E)为连通图,则从图中任一顶点出发遍历图时,必定将E(G)分成两个集合T和B,其中T是遍历图过程中走过的边的集合,B是剩余的边的集合:T∩B=空集,T∪B=E(G)。显然,G’=(V,T)是G的极小连通子图,即G’是G的一棵生成树。由深度优先遍历得到的称为深度优先生成树;由广度优先遍历得到的称为广度优先生成树。这样的生成树是由遍历时访问过的n个顶点和遍历时经过n-1条边组成的。

对于非连通图,每个连通分量中的顶点集和遍历时走过的边一起构成一棵生成树,各个连通分量的生成树组成非连通图的生成森林。

普里姆(Prim)算法

Prim是一种构造性算法。假设G=(V,E)是一个具有n个顶点的带权连通无向图,T=(U,TE)是G的最小生成树,其中U是T 的顶点集,TE是T的边集,则由G构造从起始顶点v出发的最小生成树T的步骤为:

  1. 初始化U={v},以v到其他顶点的所有边为候选边;
  2. 重复以下步骤n-1次,使得其他n-1个顶点被加入到U中:

1从候选边中挑选权值最小的边加入TE,设该边在V-U中的顶点是k,将k加入U中;

  2考察当前V-U中的所有顶点j,修改候选边,若边(k,j)的权值小于原来和顶点j关联的候选边,则用边(k,j)取代后者作为候选边。

 

克鲁斯卡尔(Kruskal)算法

Kruskal是一种按权值的递增次序选择合适的边来构造最小生成树的方法。假设G=(V,E)是一个具有n个顶点的带权连通无向图,T=(U,TE)是G的最小生成树,则构造最小生成树的步骤如下:

  1. 置U的初值等于V(即包含G中的全部顶点),TE的初值为空集(即图T中每一个顶点都构成一个分量)。
  2. 将图G中的边按权值从小到大的顺序依次选取,若选取的边未使生成树T形成回路,则加入TE,否则舍弃,直到TE中包含n-1条边为止。

猜你喜欢

转载自blog.csdn.net/qq_42288493/article/details/88848264