蓝桥杯-安慰奶牛(最小生成树kruskal)

题目大意:n只奶牛,p条路,管理员想削减路,只保留能保证牧场连通性的n-1条路。削减完后奶牛很伤心需要安慰,于是管理员需要选出耗时最少的路线 去安慰奶牛们。

输入包括安慰每只奶牛所需时间c[i],以及走每条路所需时间。

要求输出你最终选出路线所需花费的时间 (其中时间包括 管理员每天早晨起来和晚上睡前都要安慰所在牧场奶牛一次)


PS:这个 "管理员每天早晨起来和晚上睡前都要安慰所在牧场奶牛一次" 理解了很久。。。才想通,

思路:求最小生成树是肯定的,但是这里有个问题,用边权选出的生成树一定是最小的吗?不一定。  假如a、b、c共三个牧场,有a-b,a-c,b-c三条路,按照边权大小依次选得的是a-b,a-c,而b-c因为边权大没选中,但是牧场a的奶牛安慰时间比起b、c都要大,这样算下来,遍历三个牧场,从a走过时花费的时间可能比来回b-c路所要时间都要长。

所以,边权得修改。

事实上,走的每条路都要安慰一下路连接的两头奶牛,比如路线a-b-c,从a出发,由题意早晨起来要安慰一下它,所以总时间加上c[a],依次再继续走路a-b,奶牛b,路b-c,牛c,路b-c,牛b,路a-b,晚上回到a,睡前安慰a一次。  可以发现,每条路都被走两次,而且每条路相当于还加上了两端奶牛的安慰时间。

所以把每条路的边权修改为2*time[a][b]+c[a]+c[b],最后的总时间=每条路总时间+一个起点处奶牛的安慰时间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值