POJ 1639 Picnic Planning

127 篇文章 0 订阅
22 篇文章 0 订阅

 /*
这题调得快吐血了,做得真辛苦

这题主要就是求最小限度生成树,即给定一棵树,在某个节点上加上这个节点的最大度数,然后求一棵满足这样条件的
树且最终的权值和最小。这道题就是在根节点Park上做度数限定,然后求最小限度生成树
最小限度生成树的求法与MST(最小生成树密不可分)主要思路有以下几个步骤
1)将根节点从图中去除掉
2)对去除根节点的图求MST,注意这里去除根后的图可能是不连通的,所以计算MST的时候要对每个连通图都进行计算
这里我选择用Kruscal算法+并查集求MST.求完后对每个节点按照其所属的连通分量进行着色,并统计连通分量的个数
3)针对每一个连通分量,选择从根节点到这个连通分量里的节点的具有最小权值的边加入图中,假设有conn个连通分
量则一共需要加conn条边
4)由1)2)3)步骤即得到一棵conn最小限度生成树
5)假设题目限定的停车位数是kdeg,那么还需要找kdeg - conn条从根节点出发的边,所以循环kdeg - conn次,每次做
如下操作:
    a)假设对于节点k, 边[root, k, w]不在当前树中(权值为w), 那么如果把这条边加入树中就会构成一条环
    b)假设这个环中不是与根直接相连的具有最大权值的边为[from, to, weight]
    遍历所有的树中的节点,寻找具有最大weight - w值的边,如果这个差值大于0,则将这条边[root, k]加入树种
    并去除边[from, to],如果差值小于等于0则退出

感觉这道题比较折腾啊,主要是代码写得太多太容易出错
其中两个出错的地方是
1)计算MST时算错了,把不同连通分量的color值的计算弄混淆了
2)一开始edges数组的下标设成了25,结果Runtime Error,后来恍然大悟,20个节点的最大边数是c(20, 2)远远不止25,
看来还是得细心点

6099743    bobten2008    1639    Accepted    252K    16MS    C++    5170B    2009-11-07 19:12:34
Over!
*/

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值