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

管理员要削减牧场之间的道路以保持连通性,同时最小化安慰奶牛的时间成本。题目要求考虑管理员每天早晨和晚上对所在牧场奶牛的安慰。使用Kruskal算法求最小生成树时,必须考虑每条路连接的奶牛安慰时间。因此,边权需要修改为2倍的路程时间加上两个端点奶牛的安慰时间。最终,总时间为所有边的总时间和一个起点奶牛的安慰时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意: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],最后的总时间=每条路总时间+一个起点处奶牛的安慰时间。


(复习了一下kruskal。。。题量太少,还得继续刷题。。)


#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct Edge
{
    int x,y,v;
}e[100003];
int n,p;
int min_c ;
int f[10001];
bool cmp(const Edge a,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值