2012年4月6日

kruskal算法

摘要: 今天数据结构课讲了最小生成树的Kruskal算法和Prim算法,不过都只是概念,可能是怕他们听不懂吧,反正算法实现一概不讲...囧下午抱着《算法导论》跑去图书馆看Kruskal算法,发现《算法导论》真的是牛XXXX的书啊,看完之后豁然开朗,而且惊讶地发现Kruskal算法居然用到了前两天研究的并查集,爽歪歪了...Kruskal比较适用于稀疏图,是一种贪心算法:为使生成树上边的权值和最小,则应使生成树中每一条边的权值尽可能地小。具体做法:找出森林中连接任意两棵树的所有边中,具有最小权值的边,如果将它加入生成树中不产生回路,则它就是生成树中的一条边。这里的关键就是如何判断"将它加入生成 阅读全文

posted @ 2012-04-06 23:03 linzuxin 阅读(194) 评论(0) 推荐(0) 编辑

Prim算法

摘要: 前几天研究Kruskal算法,直接上手就是并查集优化,朴素算法压根就没写。这两天看Prim算法也想略过朴素版O(n^2)直接用二叉堆优化,可是发现不看朴素算法根本写不出来...囧,看来还是不能忽略基础...草稿纸上画图模拟推演了半天,终于搞清楚Prim算法朴素版的C语言实现,拿出那天学Kruskal的小题目测试了一下,通过。代码的注释我写得很详细,方便理解,有几点需要说明一下。1、2个for循环都是从2开始的,因为一般我们默认开始就把第一个节点加入生成树,因此之后不需要再次寻找它。2、lowcost[i]记录的是以节点i为终点的最小边权值。初始化时因为默认把第一个节点加入生成树,因此lowco 阅读全文

posted @ 2012-04-06 21:51 linzuxin 阅读(236) 评论(0) 推荐(0) 编辑

并查集(不相交集合)

摘要: 不相交集合有两种不同的实现,链表表示和带路径压缩的按秩合并策略。看到大家都比较喜欢用带路径压缩的按秩合并策略,那么我只认真研究了一下带路径压缩的按秩合并策略,暂时不对链表表示作讨论。 顾名思义,并查集的作用不就的“并”和“查”嘛。并查集的功能描述为:合并两个集合;将一元素并入另一集体;判断两个元素是否属于同一个集合。 通过引用两种启发式策略(按秩合并和路径压缩)就可以达到渐进意义上最快的不相交集合数据结构。1、make_set(x) 把每一个元素初始化为一个集合建立一个新的集合,其中集合只有唯一的一个元素x2、union_set(x, y)按秩合并x,y所在的集合3、find_set(x).. 阅读全文

posted @ 2012-04-06 21:44 linzuxin 阅读(231) 评论(0) 推荐(0) 编辑

导航