A. 最小生成树和哈夫曼树有什么区别
最短路径和最小生成树是不同的概念.
最短路径是对于一个图的两个结点而言的.在一个图中,结点A通过某些结点和边可以走到结点B,那这些结点和边就组成一条A到B的路径,A到B的最短路径就是A到B的所有路径中边权值总和最小的那一条(或多条).
最小生成树是对于一个图本身而言的.对于一个有n个结点的无向连通图(边没有方向,任意两点之间都存在路径可以到达),必然可以去掉某些边,使得最终剩下n-1条边,并且n个结点仍然是连通的,这n个结点和n-1条边组成了原图的一个生成树,而最小生成树就是所有可能的生成树中n-1条边的权值总和最小的那一个(或多个).
最短路径常用算法有:floyd,dijkstra,SPFA,A*等
最小生成树常用算法有:prim,kruskal
B. prim和kruscal算法得到的最小生成树是否一样
应该不一样。可以用一个图根据两算法试一下,若一样,再修改图,之后应该就可以了。
(网络或者查书本更加有效……)
构造G的最小生成树的Prim算法的基本思想是:首先置S={1},然后,只要S是V的真子集,就作如下的贪心选择:选取满足条件iS,jV-S,且c[i][j]最小的边,将顶点j添加到S中。
这个过程一直进行到S=V时为止。
Kruskal算法构造G的最小生成树:将所有的边按权从小到大排序。然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方法连接2个不同的连通分支:当查看到第k条边(v, w)时,如果端点v和w分别是当前2个不同的连通分支T1和T2中的顶点时,就用边(v, w)将T1和T2连接成一个连通分支,然后继续查看第k+1条边;如果端点v和w在当前的同一个连通分支中,就直接再查看第k+1条边。这个过程一直进行到只剩下一个连通分支时为止
C. Prim 算法和 Kruskal 算法
1).输入:一个加权连通图,其中顶点集合为V,边集合为E;
2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;
3).重复下列操作,直到Vnew = V:
a.在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;
4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。
反证法 :假设prim生成的不是最小生成树
1).设prim生成的树为G0
2).假设存在Gmin使得cost(Gmin)<cost(G0) 则在Gmin中存在<u,v>不属于G0
3).将<u,v>加入G0中可得一个环,且<u,v>不是该环的最长边(这是因为<u,v>∈Gmin)
4).这与prim每次生成最短边矛盾
5).故假设不成立,命题得证.
1).记Graph中有v个顶点,e个边
2).新建图Graphnew,Graphnew中拥有原图中相同的e个顶点,但没有边
3).将原图Graph中所有e个边按权值从小到大排序
4).循环:从权值最小的边开始遍历每条边 直至图Graph中所有的节点都在同一个连通分量中
如果这条边连接的两个节点于图Graphnew中不在同一个连通分量中,添加这条边到图Graphnew中
归纳基础:
n=1,显然能够找到最小生成树。
归纳过程:
假设Kruskal算法对n≤k阶图适用,那么,在k+1阶图G中,我们把最短边的两个端点a和b做一个合并操作,即把u与v合为一个点v',把原来接在u和v的边都接到v'上去,这样就能够得到一个k阶图G'(u,v的合并是k+1少一条边),G'最小生成树T'可以用Kruskal算法得到。
我们证明T'+{<u,v>}是G的最小生成树。
用反证法,如果T'+{<u,v>}不是最小生成树,最小生成树是T,即W(T)<W(T'+{<u,v>})。显然T应该包含<u,v>,否则,可以用<u,v>加入到T中,形成一个环,删除环上原有的任意一条边,形成一棵更小权值的生成树。而T-{<u,v>},是G'的生成树。所以W(T-{<u,v>})<=W(T'),也就是W(T)<=W(T')+W(<u,v>)=W(T'+{<u,v>}),产生了矛盾。于是假设不成立,T'+{<u,v>}是G的最小生成树,Kruskal算法对k+1阶图也适用。
由数学归纳法,Kruskal算法得证。
D. 如何用浅显的语言解释Kruskal算法和Prim算法
不严谨的说:将全集分为遍历集合未遍历集。两种算法都是遍历集慢慢扩大为全集的过程。
Kruskal:集合中元素是边,每次从未遍历集中找一个最短边,如果遍历集包含它后不会构成回路,就包含,重复过程直到所有点都连通。
Prim:集合中元素是点,每次从未遍历集中找一个距离遍历集距离最近的点,将其包含,重复过程直到包含所有点。
当然对于Kruskal,遍历集并没有扩展为全集,把全部边都包含了也没有意义了。
E. Kruskal算法和Prim算法构造它的一棵最小代价生成树的过程
Prim算法复杂度:O(n2), 与边无关,适合求边稠密的网的最小生成树。
算法思想:假设N={V,{E}}是连通网,TE是N上最小生成树中边的集合。算法从U={u0},TE ={}开始,重复执行下述操作:在所有u∈U,v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。
Kruskal算法复杂度:O(eloge),相对于Prim而言,适合求边稀疏的网的最小生成树。
算法思想:最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去次边而选择下一条代价最小的边。直至T中所有顶点都在同一连通分量上为止。
F. prim算法和kruskal 算法哪个好
Kruskal算法适用于边稀疏的情形,而Prim算法适用于边稠密的情形
G. prim算法和kruskal算法的区别
边数较少可以用Kruskal,因为Kruskal算法每次查找最短的边。 边数较多可以用Prim,因为它是每次加一个顶点,对边数多的适用。
H. 13.用Prim算法和Kruskal算法构造图的最小生成树,所得到的最小生成树是否相同
如果原来的图里面任何两条边长都不相同,那么最小生成树是唯一的,此时不管用什么方法算出来的都是一样的
但是如果图里有相等的边,那么最小生成树可能会不唯一,这样就无法保证不同的方法得到同一棵树(即使是同一个算法,只要图的编号方式改变也可能得到不同的最小生成树)
I. KRUSKAL算法和PRIM算法
不是吧,网络白科里面有这俩个算法的详细的讲解,你可以去查查
J. prim算法构造出的最小生成树唯一吗prim算法和kruskal算法构造出的最小生成树一样吗
不唯一,两种算法构造出的最小生成不一定相同。