1.问题
2.解析
1)Prim算法
初始状态:V是所有顶点的集合,即V={A,B,C,D,E,F,G};U和T都是空!
第1步:将顶点A加入到U中。 此时,U={A}。
第2步:将顶点B加入到U中。上一步操作之后,U={A}, V-U={B,C,D,E,F,G};因此,边(A,B)的权值W最小。将顶点B添加到U中;此时,U={A,B}。
第3步:将顶点F加入到U中。上一步操作之后,U={A,B}, V-U={C,D,E,F,G};因此,边(B,F)的权值W最小。将顶点F添加到U中;此时,U={A,B,F}。
第4步:将顶点E加入到U中。 上一步操作之后,U={A,B,F}, V-U={C,D,E,G};因此,边(F,E)的权值W最小。将顶点E添加到U中;此时,U={A,B,F,E}。
第5步:将顶点D加入到U中。 上一步操作之后,U={A,B,F,E}, V-U={C,D,G};因此,边(E,D)的权值W最小。将顶点D添加到U中;此时,U={A,B,F,E,D}。
第6步:将顶点C加入到U中。 上一步操作之后,U={A,B,F,E,D}, V-U={C,G};因此,边(D,C)的权值W最小。将顶点C添加到U中;此时,U={A,B,F,E,D,C}。
第7步:将顶点G加入到U中。 上一步操作之后,U={A,B,F,E,D,C}, V-U={G};因此,边(F,G)的权值W最小。将顶点G添加到U中;此时,U=V。
此时,最小生成树构造完成!它包括的顶点依次是:A B F E D C G。
2)kruskal算法
第1步:将边<E,F>加入R中。 边<E,F>的权值最小,因此将它加入到最小生成树结果R中。
第2步:将边<C,D>加入R中。 上一步操作之后,边<C,D>的权值最小,因此将它加入到最小生成树结果R中。
第3步:将边<D,E>加入R中。 上一步操作之后,边<D,E>的权值最小,因此将它加入到最小生成树结果R中。
第4步:将边<B,F>加入R中。 上一步操作之后,边<C,E>的权值最小,但<C,E>会和已有的边构成回路;因此,跳过边<C,E>。同理,跳过边<C,F>。将边<B,F>加入到最小生成树结果R中。
第5步:将边<E,G>加入R中。上一步操作之后,边<E,G>的权值最小,因此将它加入到最小生成树结果R中。
第6步:将边<A,B>加入R中。 上一步操作之后,边<F,G>的权值最小,但<F,G>会和已有的边构成回路;因此,跳过边<F,G>。同理,跳过边<B,C>。将边<A,B>加入到最小生成树结果R中。
此时,最小生成树构造完成!它包括的边依次是:<E,F> <C,D> <D,E> <B,F> <E,G> <A,B>。
3.设计
1)Prim算法
void Prim()
{
U = {A};
while (1) {
v= 未收录顶点中W最小者;
if ( 这样的v不存在 ){
break;
}
将v收录进U: visit[v] = 0;dist[v]=0;
for ( v的每个邻接点u ){
if ( visit[u]!=0未被收录 ){
if ( E (v,u)<dist[u]){
dist[u] = E (v,u) ;
parent[u] = v;
}
}
if ( U中收的顶点不到|V|个 ){
Error ( “生成树不存在” );
}
}
2)Kruscal算法
void Kruskal ( Graph G ){
T= { } ;
while ( T中不到 |V| 1 条边 && E 中还有边 ) {
从 E 中取一条权重最小的边 E (v,w) ; /* 最小堆 */
将 E (v,w) 从 E 中删除;
if ( E (v,w) 不在 最小生成树 中构成回路) /* 并查集 */
将 E (v,w) 加入 T, w加入U;
else
无视 E (v,w) ;
}
if ( 最小生成树 中不到 |V| 1 条边 )
Error ( “生成树不存在” );
}
4.分析
1)Prim算法
① (朴素版)每个顶点被选择一次,每次都遍历其他各个顶点,时间复杂度为O(n^2),空间复杂度为O(n)
② (堆优化)时间复杂度为O(mlogn)
2) Kruscal算法
① 初始化生成树的边集A为空集:O(1)
② 对集合中的每一个顶点,都将它的集合初始化为自身:O(V)
③ 将边按权值进行排序:O(ElogE)
④ 对排序好后的边从小到大进行判断,如果这条边所连的2个顶点不在同一个集合中,则将这条边加入到生成树的边集A中,并将此边所连的两个顶点u和v的集合做一个合并操作,如此循环加到生成树中的边集数量为n-1时停止:O(V+E)
⑤ 综上所述,kruscal的时间复杂度应为O(ElogE),即nlogn,空间复杂度为O(E)
5.源码
[github源码地址]
https://github.com/yuding-x/Algorithm