最小生成树的Kruskal算法,每次迭代是将剩下边集中的最小权边

题目

最小生成树的Kruskal算法,每次迭代是将剩下边集中的最小权边加入树中。

如果没有搜索结果或未解决您的问题,请直接 联系老师 获取答案。
相似问题和答案

第1题:

下面哪些使用的不是贪心算法()

A.单源最短路径中的Dijkstra算法

B.最小生成树的Prim算法

C.最小生成树的Kruskal算法

D.计算每对顶点最短路径的Floyd-Warshall算法


正确答案:D

第2题:

连通图的各边权值均不相同,则该图的最小生成树是唯一的。()


参考答案:正确

第3题:

Kruskal算法求最小生成树的时间为(),对()图比较有利。


参考答案:O(elog2e)、稀疏

第4题:

Prim算法和Kruscal算法都是无向连通网的最小生成树的算法,Prim算法从一 个顶点开始,每次从剩余的顶点加入一个顶点,该顶点与当前生成树中的顶占的连边权重 最小,直到得到最小生成树开始,Kruscal算法从权重最小的边开始,每次从不在当前的生成树顶点之间的边中选择权重最小的边加入,直到得到一颗最小生成树,这两个算法都采用了( )设计策略,且( )。

A.分治 B.贪心 C.动态规划 D.回溯 A.若网较稠密,则Prim算法更好 B.两个算法得到的最小生成树是一样的 C.Prim算法比Kruscal算法效率更高 D.Kruscal算法比Prim算法效率更高


正确答案:B,A

第5题:

对于含n个顶点、e条边的无向连通图,利用Prim算法构造最小生成树的时间复杂度(),用Kruskal算法构造最小生成树的时间复杂度为()。

A.O(n)

B.O(n²)

C.O(e)

D.O(eloge)

F.O(e²)


参考答案:B,D

第6题:

下面()算法适合构造一个稠密图G的最小生成树。

A.Prim算法

B、Kruskal算法

C.Floyd算法

D、Dijkstra算法


参考答案:A
解释:Prim算法适合构造一个稠密图G的最小生成树,Kruskal算法适合构造一个稀疏图G的最小生成树。

第7题:

对(),用Prim算法求最小生成树较为合适,而Kruskal算法适于构造()图的最小生成树。

A.完全图

B.连通图

C.稀疏图

D.稠密图


参考答案:D,C

第8题:

●对于n个顶点e条边的无向连通图,利用Prim算法生成最小生成树的时间复杂度为 (24) ,利用Kruskal算法生成最小生成树的时间复杂度为 (25) 。

(24) A.O((n+1)2 )

B.O(n2 )

C.O(n2-1)

D.(n2+1)

(25) A.O(log2e)

B.O(log2e-1)

C.O(elog2e)

D.以上都不对


正确答案:B,C
【解析】此题是考查数据结构图的应用。

第9题:

B.Kruskal算法:(贪心)

按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。

function find(v:integer):integer; {返回顶点v所在的集合}

var i:integer;


正确答案:

 

B.Kruskal算法:(贪心)

按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。
function find(v:integer):integer; {返回顶点v所在的集合}
var i:integer;

第10题:

●试题四

阅读下列算法说明和算法,将应填入(n)的字句写在答题纸的对应栏内。

【说明】

下列最短路径算法的具体流程如下:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择不使森林中产生回路的边加入到森林中去,直至该森林变成一棵树为止,这棵树便是连通网的最小生成树。该算法的基本思想是:为使生成树上总的权值之和达到最小,则应使每一条边上的权值尽可能地小,自然应从权值最小的边选起,直至选出n-1条互不构成回路的权值最小边为止。

图5算法流程图

【算法】

/*对图定义一种新的表示方法,以一维数组存放图中所有边,并在构建图的存储结构时将它构造为一个"有序表"。以顺序表MSTree返回生成树上各条边。*/

typedef struct{

VertexType vex1;

VertexType vex2;

VRType weight;

}EdgeType;

typedef ElemType EdgeType;

typedef struct{//有向网的定义

VertexType vexs[MAX_VERTEX_NUM];//顶点信息

EdgeType edge[MAX_EDGE_NUM];//边的信息

int vexnum,arcnum;//图中顶点的数目和边的数目

}ELGraph;

void MiniSpanTree_Kruskal(ELGraph G,SqList& MSTree){

//G.edge 中依权值从小到大存放有向网中各边

//生成树的边存放在顺序表MSTree中

MFSetF;

InitSet(F,G.vexnum);//将森林F初始化为n棵树的集合

InitList(MSTree,G.vexnum);//初始化生成树为空树

i=0;k=1;

while(k< (1) ){

e=G.edge[i];//取第i条权值最小的边

/*函数fix_mfset返回边的顶点所在树的树根代号,如果边的两个顶点所在树的树根相同,则说明它们已落在同一棵树上。*/

rl=fix_mfset(F,LocateVex(e.vex1));

r2= (2) //返回两个顶点所在树的树根

if(r1 (3) r2){//选定生成树上第k条边

if(ListInsert(MSTree,k,e){ (4) ;//插入生成树

mix_mfset(E,rl,r2);//将两棵树归并为一棵树

}

(5) ;//继续考察下一条权值最小边

}

DestroySet(F);

}


正确答案:
●试题四【答案】(1)G.vexnum(2)fix_mfset(F,LocateVex(e.vex2))(3)!=(4)k++(5)i++【解析】本题考查的是克鲁斯卡尔(Kruskal)算法。理解该算法的关键在于:由于生成树上不允许有回路,因此并非每一条居当前权值最小的边都可选。例如,如图2所示的连通网G5,在依次选中了(e,f),(b,c),(e,d)和(f,g)的4条边之后,权值最小边为(g,d),由于g和d已经连通,若加上(g,d)这条边将使生成树上产生回路,显然这条边不可取。同理,边(f,d)也不可取,之后则依次取(a,g)和(a,b)两条边加入到生成树。那么在算法中如何判别当前权值最小边的两个顶点之间是否已经连通?从生成树的构造过程可见,初始态为n个顶点分属n棵树,互不连通,每加入一条边,就将两棵树合并为一棵树,在同一棵树上的两个顶点之间自然相连通。由此判别当前权值最小边是否可取只要判别它的两个顶点是否在同一棵树上即可。

更多相关问题