2011.10.28 poj2421 Constructing Roads 解题报告

来源:互联网 发布:eve online mac版 编辑:程序博客网 时间:2024/05/22 14:28

今晚写算法的时候,俺的手指各种犯贱,各种敲错。泪奔啊~~~

题目不贴了,自己看吧。http://poj.org/problem?id=2421

MST(最小生成树)水题一道,我却做了好久。待会分析原因(第四部分)。

一、做题状况:
     前几天看了算导MST的那一章(其实,大概半年前就看了些,当时觉得贪心算法没掌握好,所以只看了一半,想掌握好贪心后再回来看,现在觉得很多时候前面的坎要自己越过去,有些坎可以以后再迈)。对Kruscal算法和Prim算法心里有了基本的认识。今天特意找到这道MST题测一测。


二、思路分析:
   其实也没太多可以分析的,最经典的MST,区别是,现在已经有些道路(线)已经建立好,怎么解决这个问题呢? 聪明人的答案是:把对应这条线赋值0。很可惜,我不是聪明人。。。


三、题目类型:MST
四、进步
    Kruscal算法:
    今天写代码真是手贱啊,犯了好几处傻。
    第一次:忘记输入已建好的道路的标号是从1开始的,而程序的索引是从0开始的。
    第二次:在进行树合并的过程中,忘了更新各棵树的根了,导致每次都全部加起来了。
    第三次:没考虑到更新的过程中,有可能把更新过程中需要用到“原始变量”直接更新了,那么以后比较的是什么?是新的树根了!不是我们Expect的那个树根!
     PS:还好有算导上面的那个例子,供我单步调试,否则我估计今晚就可以去死了。
   待会写Prim算法,及时更新~~~
   ...失败。。。Prim里确实要用到二叉最小堆,或者至少要建立一个数据结构集合来维护当前“周围可选的线段”。明天写好Prim版本的程序!!!!!!
    写完了,Prim算法的速度比Kruscal算法要几乎快3倍,不过实现起来稍微复杂一些。看来二叉堆的相关操作也不是很难,高手几分钟的事情就可以搞定,尽管我不是高手,至少现在不是。BTW,编程珠玑上的二叉堆实现,真是精炼到了极致,算导是一本《孙子兵法》,而编程珠玑则是一本《实战宝典》。
    以后还是要不断的练,像那天侯毅凌教授在北邮教三里的对英语演讲讲座上说的那样,practise!practise!practise!
    



原创粉丝点击