1930. 灌溉农田(irrigation)

该博客讨论了在农田灌溉问题中如何构建最低成本的供水管网。农夫约翰面临的问题是每条管道的建设成本至少为C,他需要找到一种方式连接所有农田以确保最低总成本。这个问题可以通过最小生成树算法来解决,但需要筛选出代价大于等于C的边进行连接。博客提供了样例输入、输出以及数据范围,并解释了如何应用最小生成树算法解决这个问题。
摘要由CSDN通过智能技术生成

1930. 灌溉农田(irrigation)

题目描述
由于最近缺少降雨,农夫约翰决定在他的N块农田之间建立一个供水管网。每块的位置可以用一个二维坐标来表示(xi,yi),在第i块地和第j块地之间修建一个管道的话,代价是(xi - xj)^2 + (yi - yj)^2。农夫约翰想要建立一个花费代价最小的供水管网,使得他所有的地都能被连接在一起(使得水能够通过一系列的管道流到各个田地里去)。不幸的是,建造管道的人拒绝建造花费代价小于C的单条管道。请帮助约翰计算最少需要花费多少代价,才能建成这个供水管网。

输入
第一行是两个正整数N和C。
第2行到第N+1行,每行两个整数,表示xi和yi。

输出
输出建立供水管网的最小代价,如果不能建立供水管网,就输出-1。

样例输入

3 11 
0 2 
5 0 
4 3

样例输出

46

数据范围限制
1<=N<=2000,0<=xi,yi<=1000。

提示
样例中,约翰不能在(4,3)和(5,0)之间建立管道,因为这个管道的代价是10。因此,他只能在(0,2)和(5,0)之间修建一条管道,花费是29,在(0,2)和(4,3)之间修建一条管道,花费是17,所以总的最小花费是29+17=46。

思路:
这是一道典型的最小生成树。因为农夫想要代价最小,所以只需n-1条边,然后保证n-1条边权和最小。故可以用最小生成树。
唯一考虑只有边权>=花费代价C,才能加边。

#include<cstdio>
#include<iostream>
#include<cstring>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int INF=2147483647;
long long n,m,a[2010],b[2010
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值