首页 篮球资讯

克鲁斯卡尔最小生成树,...请分别按Prim算法和Kruskal算法求最小生成树.

来源:龙部落直播吧  更新时间: 2024-03-29 15:39:48   作者:知酒客

一、...请分别按Prim算法和Kruskal算法求最小生成树.

克鲁斯卡尔最小生成树,...请分别按Prim算法和Kruskal算法求最小生成树.

克鲁斯卡尔最小生成树,...请分别按Prim算法和Kruskal算法求最小生成树.

假设N=(V,E)是一个具有n个顶点的连通网,T=(U,TE)是所求的最小生成树,其中U是T的顶点集,TE是T的边集。

(1)初始U={u0}(u0∈V),TE=φ;

(2)在所有u∈U,v∈V-U的边中选一条代价最小的边(u0,v0)并入集合TE,同时将v0并入U;

此时,TE中必含有n-1条边,则T=(V,{TE})为N的最小生成树。

假设N=(V,E)是一个具有n个顶点的连通网,

(2)按权值由小到大的顺序选择边,所选边应满足两个顶点不在同一个顶点集合内,将该边放到生成树边的集合中。同时将该边的两个顶点所在的顶点集合合并;

(3)重复(2),直到所有的顶点都在同一个顶点集合内。

二、请构造下图所示网络最小生成树

1、用Kruskal(克鲁斯卡尔)算法,求最小生成树.

2、先将所有边的权值按照从小到大排序:

3、然后,每次提取权值最小边,逐步组成最小生成树:

4、(2)取边(v2,v6,10),不会产生环路.

5、(3)取边(v1,v3,12),不会产生环路.

6、(4)取边(v1,v4,14),不会产生环路.

7、(5)如果取边(v3,v4,16),会产生环路,所以不能取.

8、这就是最小生成树,连通了所有顶点,总权值最小.

9、//最小生成树Kruskal(克鲁斯卡尔)算法

10、}Edge;//对边集数组Edge结构的定义

11、 for(i=0;i<G->numVertexes;i++)//初始化图

12、 for(j=0;j<G->numVertexes;j++)

13、 G->arc[i][j]=G->arc[j][i]=INF;

14、 for(i=0;i<G->numVertexes;i++)

15、 for(j=i;j<G->numVertexes;j++)

16、 G->arc[j][i]=G->arc[i][j];

17、voidSwapn(Edge*edges,inti,intj)

18、 edges[i].begin=edges[j].begin;

19、 edges[i].weight=edges[j].weight;

20、voidsort(Edgeedges[],MGraph*G)

21、 for(i=0;i<(G->numEdges-1);i++)

22、for(j=i+1;j<G->numEdges;j++)

23、if(edges[min].weight>edges[j].weight)

24、 printf("权值排序之后的为:\n");

25、 for(i=0;i<G->numEdges;i++)

26、 printf("(%d,%d)%d\n",edges[i].begin,edges[i].end,edges[i].weight);

27、voidMiniSpanTree_Kruskal(MGraphG)

28、 intparent[MAXVEX];//定义一数组用来判断边与边是否形成环路

29、 Edgeedges[MAXEDGE];//定义边集数组,edge的结构为begin,end,weight,均为整型

30、 for(i=0;i<G.numVertexes-1;i++)

31、 for(j=i+1;j<G.numVertexes;j++)

32、 sort(edges,&G);//从小到大排序

33、 for(i=0;i<G.numVertexes;i++)

34、 printf("打印最小生成树:\n");

35、 for(i=0;i<G.numEdges;i++)//循环每一条边

36、 n=Find(parent,edges[i].begin);

37、 if(n!=m)//假如n与m不等,说明此边没有与现有的生成树形成环路

38、 parent[n]=m;//将此边的结尾顶点放入下标为起点的parent中

39、//表示此顶点已经在生成树集合中

40、 printf("(%d,%d)%d\n",edges[i].begin,edges[i].end,edges[i].weight);

三、最小生成树 普里姆算法和克鲁斯卡尔算法

kruskal算法的时间复杂度主要由排序方法决定,其排序算法只与带权边的个数有关,与图中顶点的个数无关,当使用时间复杂度为O(eloge)的排序算法时,克鲁斯卡算法的时间复杂度即为O(eloge),因此当带权图的顶点个数较多而边的条数较少时,使用克鲁斯卡尔算法构造最小生成树效果最好!

假设 WN=(V,{E})是一个含有 n个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n棵树的一个森林。之后,从网的边集 E中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至森林中只有一棵树,也即子图中含有 n-1条边为止。

假设 WN=(V,{E})是一个含有 n个顶点的连通网,TV是 WN上最小生成树中顶点的集合,TE是最小生成树中边的集合。显然,在算法执行结束时,TV=V,而 TE是 E的一个子集。在算法开始执行时,TE为空集,TV中只有一个顶点,因此,按普里姆算法构造最小生成树的过程为:在所有“其一个顶点已经落在生成树上,而另一个顶点尚未落在生成树上”的边中取一条权值为最小的边,逐条加在生成树上,直至生成树中含有 n-1条边为止。

--以上传自

//题目地址:

int cmp(const void*a,const void*b)//快排比较函数

return((node*)a)->len-((node*)b)->len;

int v[100],a[100][100];//v为点集

if(!used[j]&& dis[k][j]<d[j])

d[j]= dis[k][j];//与Dijksta算法的差别之处

cout<<prim(n)<<endl;

四、关于最小生成树的说法正确的是

1、下列关于最小生成树的叙述中,正确的是

2、Ⅱ.权值最小的边一定会出现在所有的最小生成树中

3、Ⅲ.使用普里姆(Prim)算法从不同顶点开始得到的最小生成树一定相同

4、Ⅳ.使用普里姆算法和克鲁斯卡尔(Kruskal)算法得到的最小生成树总不相同

5、A.仅ⅠB.仅ⅡC.仅Ⅰ、ⅢD.仅Ⅱ、Ⅳ

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

7、一个连通图的所有生成树都包含相同的顶点个数和边数;

8、移除生成树中的任意一条边都会导致图的不连通,生成树的边最少特性;

9、在生成树中添加一条边会构成环。

10、对于包含n个顶点的连通图,生成树包含n个顶点和n-1条边;

11、对于包含n个顶点的无向完全图最多包含nn−2颗生成树。

12、所谓一个带权图的最小生成树,就是原图中边的权值最小的生成树,所谓最小是指边的权值之和小于或者等于其它生成树的边的权值之和。

五、克鲁斯卡尔算法求最小生成树

1、克鲁斯卡尔算法的基本思想,这是我自己结合教材理解的,难免有误,谨慎参考:

2、1:将图中的n顶点看成是n个集合。解释为,图中共有6个顶点,那么就有六个集合。即a,b,c,d,e,f各自分别都是一个集合。{a},{b}等。

3、2:按权值由小到大的顺序选择边。所选边应满足两个顶点不在同一个顶点集合内。将该边放到生成树边的集合,同时将该边的两个顶点所在的集合合并。这是书上的描述,可能有点难理解,这里解释一下:

4、首先,选择权值最小的边,即为图中的(a,c)边,此时a,c满足不在同一个顶点集合内,将这个边记录下来,然后合并这两个顶点的集合,即此时剩下五个顶点集合了,{a,c},{b},{d},{e},{f}

5、3:重复步骤2,直到所有的顶点都在同一个集合内!解释如下:

6、此时剩下的边中权值最小的为(d,f),满足不在同一个顶点集合,所以记录下该边,然后合并这两个顶点集合。新的顶点集合为{a,c}{b}{e}{d,f}

售后好的法甲比分“法甲联赛17轮大巴黎阵容”

售后好的法甲比分“法甲联赛17轮大巴黎阵容”

7、接着,继续重复,选择边(b,e),满足不在同一个顶点集合内,所以记录下该边,然后再次合并这两个集合,新的集合为{a,c}{d,f}{b,e}

8、继续,选择边(c,f),满足不在同一个顶点集合内,所以记录下该边,然后合并这两个顶点所在的集合,新集合为{a,c,d,f}{b,e}

法甲赔率哪家准确“法甲推荐关c77 tv”

法甲赔率哪家准确“法甲推荐关c77 tv”

9、再继续,选择权值为15的边,发现边(c,d)和边(a,d)都不满足条件不在同一个顶点集合内,所以只能选择边(b,c),记录下该边,然后合并顶点集合,新集合为{a,b,c,d,e,f},此时所有点都在同一集合内,所以结束!

10、4:将上面我们记录的那些边连接起来就行了!这就是最小生成树,附本人手绘:

六、普利姆和克里斯卡尔最小生成树什么情况下不一样

抖音可以看法甲“法甲免费比赛在哪里看直播”

抖音可以看法甲“法甲免费比赛在哪里看直播”

不总是一样的,克鲁斯卡尔算法是精确算法,即每次都能求得最优解,但对于规模较大的最小生成树问题,求解速度较慢。而普里姆算法是近似求解算法,虽然对于大多数最小生成树问题都能求得最优解,但相当一部分求得的是近似最优解。这是我个人见解。

文章导读:

标签:登比察   伊利肯马哈伦   UFC 索丁   

下一篇 >

今晚18点日本vs哥斯达黎加:今晚世界杯赛程

下一篇 >

曼城巴萨欧冠:曼城得过欧冠吗