提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
1.问题
[描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)]
在加权连通图里搜索最小生成树
2.解析
[问题的理解和推导,可用电子版直接在此编写,也可用纸笔推导,拍照嵌入本文档]
Prim算法
1.随机选择一个点作为根节点,把这个根节点当成一棵树
2.选择图中距离这棵树最近且没有被树收录的一个点,把它收录在树中并保证不构成回路
3.重复以上步骤,把图的顶点一一收录进树中
4.如果没有顶点可以收录了
A.如果图中的顶点数量等于树的顶点数量–>最小生成树构造完成
B.如果图中的顶点数量不等于树的顶点数量–>此图不连通
Kruskal算法
3.设计
[核心伪代码]
Void Prim(s)
{
MST={s}
While(1){
V=未收录顶点中的最小者;
If(V不存在)
Break;
把V收入MST
V被收录;
For(V的每个邻接点W)
If(W未被收录)
if(V到W的距离<W到生成树的距离)
最小生成树到W的距离=V到W的距离;
If(MST中收的顶点不到
}
If(MST中收的顶点不到|V|个)
Error(“生成树不存在”);
}
void Kruskal ( Graph G )
{
MST = { } ;
while ( MST 中不到 |V| 1 条边 && E 中还有边 ) {
从 E 中取一条权重最小的边 E (v,w) ; /* 最小堆 */
将 E (v,w) 从 E 中删除;
if ( E (V,W) 不在 MST 中构成回路) /* 并查集 */
将 E (V,W) 加入 MST;
else
彻底无视 E (V,W) ;
}
}
if ( MST 中不到 |V| 1 条边 )
Error ( “生成树不存在” );
}
4.分析
[算法复杂度推导]
kruskal复杂度O(ElgV)。
朴素prim复杂度O(V^2)
而斐波那契堆优化的prim,能达到O(E + VlgV)。
5.源码
[github源码地址]
Github:https://github.com/RyokoJiang/homework