kruskal算法分析

谁能说说为什么kruskal 算法不能适用于边重为负的情况?...基本想法假设,正确性证明.. 。

1、克鲁斯卡尔 算法哈哈,因为爱 。父编号集合了每个连接组件的第一个起点 。在初始状态下,有n个节点和n个分量 , 都是第一个,所以都赋值为0 。开始融合后,成分逐渐融合在一起 。父节点记录父节点,只有一个连接的组件的父节点为0 。实际上,这个父数组是用来判断新选择的边和已有的边是否形成环的 。这个结构是树的父表示 。当新边的两个顶点的根不相同时,自然意味着两个顶点之间的边不足以形成环 。这种结构通常称为“并集”,用于检测等价关系 。这里,它用来判断顶点是否在一个集合中 。可以看数据结构教材树那一章的介绍 。

2、谁能说说为什么 kruskal 算法不能应用于边权为负的情况?而非要用bellman...你是不是搞错了?是单源最短路径的Dijkstra 算法 。边权重不能为负 , 因为它的算法是从当前的最小路径长度开始逐渐增加的 , 不会往回计算 。如果边权重为负,Bellman 算法是自然选择,Floyd 算法是备选 。使用后两者的前提是没有负重圈,因为转一圈就变小了,再转一圈就变小了 。Kruskal 算法是求最小生成树,边权为

3、...请分别按Prim 算法和Kruskal 算法求最小生成树.Prim(Prim)算法基本思想假设N(V,E)是有N个顶点的连通网络 , T(U,te)是最小生成树 , 其中U是T的顶点集,TE是T的边集..(1)初始u {u0} (u0 ∈ v),teφ;(2)从u∈U,v∈VU的所有边中,选择一条成本最低的边(u0,v0)并将v0合并到集合TE中;(3)重复(2)直到UV 。此时TE中必有n1条边 , 所以T(V,{TE})是n的最小生成树..

e)是具有n个顶点的连通网络,(1)将n个顶点视为n个集合;(2)按照权重从小到大的顺序选择一条边,选择的边要满足两个顶点不在同一个顶点集中,将这条边放入生成树边的集合中 。同时合并边的两个顶点所在的顶点集;(3)重复(2)直到所有顶点都在同一顶点集中 。注:1 。最小生成树不是唯一的 。2.图表从最小的节点开始 。

4、图的最小生成树 算法(Prim和Kruskal graph的邻接矩阵表示可以参考:测试图如图:思路:首先选择一个顶点加入最小生成树,然后选择与该顶点连接的边的最小权值对应的顶点加入生成树 , 将这两个顶点作为新的最小生成树 , 继续判断与该树连接的边的最小权值对应的顶点 , 并将其加入最小生成树,直到所有顶点都加入生成树 。测试程序的测试结果:思路:图的存储结构用边集数组的形式表示 , 边集数组按权重从小到大排序,遍历边集数组,每次选择一条边判断是否形成回路,如果不形成回路,则加入最小生成树,最终将只包含n1条边(n为无向图的顶点数) 。

5、求Kruskal 算法正确性证明b Proof:设G是任意不同于Kruskal 算法生成的树F的树 。考虑构造f的过程,设E是第一次不属于G的边 。如果把E加到G上 , 会得到一个圆c,这个圆不完全包含在F中 , 所以c中有一条不属于F的边F,我们得到一棵新树H,我们想证明H不比G贵 , 也就是说E不比F贵,通过反证法,假设F比E便宜,现在考虑这个问题:为什么Kruskal 算法选择F而不是E?
【kruskal算法分析】即F在加入E之前会与F中选择的边形成一个圆,但所有这些被选择的边都是G的边 , 因为E是第一个不属于G的边 , F本身属于G,所以G包含一个圆,这是不可能的(G是一棵树) 。这个矛盾证明了H并不比G贵,因此,我们可以用H代替G,H比G更接近F(即H和F更多 。

    推荐阅读