POJ 1639 Picnic Planning【度限制最小生成树】

/*  第一道度限制生成树,写的比较崩溃@@
 *  度限制生成树是指对生成树中某些点限制度的生成树,如果是要求权值最小的话
 *  便是度限制最小生成树。一般题目也就是对某一个点进行度限制,因为所有点进行
 *  度限制是NP问题。
 *  解法:1)先去掉有度限制的点和与它相邻的边,对求剩下的点求最小生成树。由于剩下的点可能不连同,所以
 *                 要对每一个连通分量求最小生成树。
 *              2)然后对每一个连通分量,从中找出一条距原点(有度限制的点)最短的一条边加进去。如果有M个连通分量,
 *                 那么现在求得的便是一个M度最小生成树。
 *              3)设度限制为K > M,那么再进行 K-M 次循环,每次进行如下操作:对每一个不在生成树中的点,连一条到原点的
 *                  边,那么现在一定构成了一个环。然后找出这个环中除了新连的边外最长的边,和新添加的边作差。
 *                 如果结果是负值,找到最小的这个值,更新,如此进行K-M 次操作。
 *                 由于该题求的是不超过K度的生成树,所以如果无法更新便可直接跳出循环
 *             PS:以上便是度限制生成树的基本算法,个人感觉其中关键部分一个是对每一个连通分量求最小生成树,另一个便是添边然后找环
 *                      操作,网上的大部分解法都很复杂,代码动辄200+  今天请教了Ych,他教了我一个好方法,可以这样:由于去掉原点后图可能
 *                      不连通,而对每一个连通分量求最小生成树又很烦,所以可以初始化时将所有边初始化为无穷大,然后对去掉原点的图只进行一次
 *                      求最小生成树的操作。这样如果图不连通的话那么会自动加一条无穷大的边,但是没关系。接下来在从生成树中找到一个距原点
 *                      最近的点加到生成树中,此时是一棵1度生成树(不是最小生成树),然后进行K-1次上述的更新。其中找环可以用DFS,也可以用
 *                      BFS。我选择了BFS,因为更直观。
 *            最后有一点一定要注意就是对某些变量赋值时的无穷大一定要比边初始化的那个无穷大还要大,否则会出错。今天因为这个错误调试
 *            了近两个小时。。。崩溃。。。
 */

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值