求下面带权图的最小(代价)生成树时,可能是克鲁斯卡尔(Kruskal)算法第2次选中但不是普里姆(Prim)算法(从v4开始)第2次选中的边是( )。
A.(v₁,v₃) B.(v₁,v₄) C.(v₂,v₃) D.(v₃,v₄)
首先,认识什么是克鲁斯卡尔Kruskal算法和普里姆Prim算法 ↓
克鲁斯卡尔Kruskal算法
在整个过程中都是选取网中权值为最小的边
- 克鲁斯卡尔算法是一个使网中所有顶点相连通而所需边的条数为最小的子网络,且其代价和在所有生成树中为最小的算法。
- 是从另一途径求边稀疏的连通网的最小生成树。
- 最小生成树在初始时,是网中所有顶点的集合,它们之间没有任何一条边连接,即它们自成一个连通分量。
- 然后就开始执行克鲁斯卡尔算法,它这个算法是将两个小的连通分量连接为较大的连通分量,即在整个过程中都是选取网中权值为最小的边,直至所有顶点都在一个连通分量中为止。
执行情况即基本思想如下:
假设连通网G=(V,E),令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),概述图中每个顶点自成一个连通分量。
在E中选择代价最小的边,每当选取网中权值为最小的边时总会出现以下两种情况之一【即判断新选取的边的两个顶点是否属于同一个连通分量。】:
- 该边所依附的两个顶点属于同一个连通分量。
- 如果选取这条边作为最小生成树的一条边,则必将构成环。
故属于这种情况的边即使其权值小也应该舍弃。
因为连通分量中任意两个顶点间都有路径相通,一旦再加入一条边,该边所依附的两个顶点之间就有了两条路径,即构成了环。
该边所依附的两个顶点分别在T中不同的连通分量上。
即所选的边不与原来的路径构成环,该边可以作为最小生成树的一条边,将此边加入到T中
因为两个不同的连通分量通过这条边的连接而相连通,成为了一个连通分量 。
否则,舍去此边而选择下一条代价最小的边。
依此类推,直至T中所有顶点构成一个连通分量为止
普里姆Prim算法
在整个过程中都是选取与已知点集关联的最短代价边
- 又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。
- 可在加权连通图里搜索最小生成树。
- 由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。
所以回到题目:
求下面带权图的最小(代价)生成树时,可能是克鲁斯卡尔(Kruskal)算法第2次选中但不是普里姆(Prim)算法(从v4开始)第2次选中的边是( )。
A.(v₁,v₃) B.(v₁,v₄) C.(v₂,v₃) D.(v₃,v₄)
根据:
克鲁斯卡尔Kruskal算法在整个过程中都是选取网中权值为最小的边
普利姆Prim算法在整个过程中都是选取与已知点集关联的最短代价边
那么,看两种算法是怎么选边的:
次序 克鲁斯卡尔Kruskal算法 普利姆Prim算法 第1次 (v₁,v₄)
【克鲁斯卡尔算法要求选取网中权值为最小的边,那第一次肯定选权值最小的5,即(v₁,v₄) 】
(v₁,v₄)
【第一次无已知点集,但题目说是从v4开始,故最短的那条边即为(v₁,v₄) 】
第2次 (v₁,v₃),(v₂,v₃) ,(v₃,v₄)
【克鲁斯卡尔算法要求如果所选的边不与原来的路径构成环,则该边可以作为最小生成树的一条边,将此边加入到T中。
故第二次(v₁,v₃),(v₂,v₃) ,(v₃,v₄)这三个都与(v₁,v₄) 不构成环,故都有可能选择这三个其中一个】
(v₁,v₃),(v₃,v₄)
【Prim算法只找与已知点集关联的最短代价边,已知点集为第一次的(v₁,v₄),要与其关联只能是选出来的路径它的括号里有一个v₁,要不就是括号里有一个v₄。
故可能为(v₁,v₃),(v₃,v₄),(v₁,v₂),(v₂,v₄)
又因为要求是最短的代价边,故只能选取权值为8的,权值为10或11的舍去,故(v₁,v₂),(v₂,v₄)舍去
故(v₁,v₃),(v₃,v₄)这两个符合】
故克鲁斯卡尔(Kruskal)算法第2次选中的为(v₁,v₃),(v₂,v₃) ,(v₃,v₄),
普里姆(Prim)算法(从v4开始)第2次选中的边是(v₁,v₃),(v₃,v₄),
故克鲁斯卡尔(Kruskal)算法第2次选中但不是普里姆(Prim)算法(从v4开始)第2次选中的边即为(v₂,v₃)