题目大意:

题目链接:https://jzoj.net/senior/#main/show/5353
为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里每座建筑都连上互联网,方便未来随时随地网购农药。
他的农庄很大,有N 座建筑,但地理位置偏僻,网络信号很差。
一座建筑有网,当且仅当满足以下至少一个条件:
1、给中国移动交宽带费,直接连网,花费为A。
2、向另外一座有网的建筑,安装共享网线,花费为B×两者曼哈顿距离。
现在,农夫约已经统计出了所有建筑的坐标。他想知道最少要多少费用才能达到目的。


思路:

首先有一点很明显的。如果最终的网络形成了kkk个联通块,那么就必须交A×kA\times kA×k的钱。
那么对于一个已经有部分网络共享线的图,倘若连接xxx和yyy,那么肯定要满足一下两个要求才会最优:

  • xxx和yyy位于两个不同联通块内。否则根本没必要连。
  • dis[x][y]×B≤Adis[x][y]\times B\leq Adis[x][y]×B≤A,否则直接分别在这两个联通块上联网即可。

发现没,这正是一个最小生成树。
用KruskalKruskalKruskal,当现在最小的边所需要的费用大于AAA之后停止连边,此时的网线及为最优解。


代码:

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;const int N=1010;
int n,A,B,x[N],y[N],father[N],sum,s,u,v,tot;
bool vis[N];struct edge
{int from,to,dis;
}e[N*N];void add(int from,int to,int dis)
{e[++tot].to=to;e[tot].from=from;e[tot].dis=dis;
}bool cmp(edge x,edge y)
{return x.dis<y.dis;
}int find(int x)
{return x==father[x]?x:find(father[x]);
}int main()
{freopen("pupil.in","r",stdin);freopen("pupil.out","w",stdout);scanf("%d%d%d",&n,&A,&B);for (int i=1;i<=n;i++){scanf("%d%d",&x[i],&y[i]);father[i]=i;}for (int i=1;i<=n;i++)for (int j=i+1;j<=n;j++)add(i,j,abs(x[i]-x[j])+abs(y[i]-y[j]));  //求出任意两点之间的曼哈顿距离sort(e+1,e+1+tot,cmp);for (int i=1;i<=tot;i++)  //Kruskal{u=e[i].from;v=e[i].to;if (e[i].dis*B>A) break;  //连接更优才继续if (find(u)!=find(v)){father[find(u)]=find(v);sum+=e[i].dis*B;  //连接所需的费用}}for (int i=1;i<=n;i++)  //求联通块个数,后来发现大可不必这么麻烦if (!vis[find(i)])  //没有记录过这个联通块{vis[find(i)]=1;s++;}printf("%d\n",sum+s*A);return 0;
}

【JZOJ5353】【NOIP2017提高A组模拟9.9】村通网【最小生成树】相关推荐

  1. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫

    Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...

  2. JZOJ 5392. 【NOIP2017提高A组模拟10.5】Lucky Transformation

    Description Input Output Sample Input 7 2 2343223 4 1 2234 Sample Output 2243233 2334 Data Constrain ...

  3. JZOJ 5371. 【NOIP2017提高A组模拟9.17】组合数问题

    Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数.举个例子,将{1,2,3}拆分成2 个集合有({1},{2,3}),({2},{1,3}),({3 ...

  4. JZOJ 100047. 【NOIP2017提高A组模拟7.14】基因变异

    Description 21 世纪是生物学的世纪,以遗传与进化为代表的现代生物理论越来越多的 进入了我们的视野. 如同大家所熟知的,基因是遗传因子,它记录了生命的基本构造和性能. 因此生物进化与基因的 ...

  5. JZOJ 100041. 【NOIP2017提高A组模拟7.12】列车调度

    Description Input Output Sample Input Sample1: 3 1 2 3 Sample2: 9 1 3 2 4 8 6 9 5 7 Sample Output Sa ...

  6. JZOJ 100030. 【NOIP2017提高A组模拟7.8】为了爱情

    Description Input 输入文件第一行包含一个正整数 k.之后是 k 组测试用例. 每组测试用例的第一行为一个整数 n.接下来 n 行,每行 n 个以空格隔开的数,用来 描述棋盘的初始状态 ...

  7. JZOJ 100026. 【NOIP2017提高A组模拟7.7】图

    Description 有一个n个点n条边的有向图,每条边为< i,f(i),w(i)>,意思是i指向f(i)的边权为w(i)的边,现在小A想知道,对于每个点的si和mi. si:由i出发 ...

  8. 【NOIP2017提高A组模拟9.5】 NYG的背包

    题目描述 N Y G NYG NYG有一个神奇的背包,每放进去一个物品,背包的体积就会变大. 也就是说,每放进一个物品,背包会被占用一定的体积,但是紧接着背包的总体积又会增大一定的值(注意是在放入物品 ...

  9. 【NOIP2017提高A组模拟10.7】Confess

    Description: 小w 隐藏的心绪已经难以再隐藏下去了. 小w 有n + 1(保证n 为偶数) 个心绪,每个都包含了[1,2n] 的一个大小为n 的子集. 现在他要找到隐藏的任意两个心绪,使得 ...

最新文章

  1. optee的RPC流程的代码详解
  2. Educational Codeforces Round 72 (Rated for Div. 2)
  3. 一篇文章带你实操代码理解盒子模型
  4. python大写字母怎么表示_python – 如何在字符串中搜索大写字母并返回带有和不带大写字母的单词列表...
  5. android中的多媒体应用camera
  6. 通达信登录服务器文件夹,我也搞定了通达信交易系统多帐号登录交易!
  7. HUSTOJ配置文件解释
  8. matlab编制log算子程序代码,8.5.1实验1用Matlab生成LOG算子的图像.PDF
  9. 如何下载哔哩哔哩(bilibili)网页端视频
  10. 用AI给图片上色 在线将黑白照片处理成彩色照片工具(干货)
  11. cobbler集成服务器批量安装操作系统(无人值守)
  12. 郑大网教育计算机2017,郑州大学-“2017中国大学生计算机设计大赛河南省级赛”在郑州大学举行...
  13. 服务器运维的日常工作,运维工作人员日常工作重点有哪些?
  14. 如何提高深度学习预测准确率
  15. 一款常用文档生成工具:Doxygen
  16. linux 解压缩压缩文件(zip、rar、7z、tar)
  17. SkeyeVSS构筑公交车载智能视频监控系统:公交运行的网络安全墙
  18. NVMe Driver 需要装吗_家里已经安装了断桥铝门窗,还需要装纱窗吗?为什么?
  19. 反射式5×5衍射光束分束器的分析
  20. 微信小程序的基础知识点汇总

热门文章

  1. 四款小众但非常实用的软件推荐
  2. 【Java】917. 仅仅反转字母---使用双指针移动
  3. csdn博客名字修改
  4. Java第四天笔记02——方法的定义及调用
  5. allegro差分信号走线_高速PCB设计软件allegro16.6演示差分规则的设置
  6. 逻辑仿真工具VCS的使用-Makefile
  7. Highly Efficient Salient Object Detection with 100K Parameters论文解读
  8. 计算机二级c常用算法,闽高校计算机二级C语言常用算法
  9. 仙居机器人_仙居三名高中生拿下国际机器人大赛总决赛冠军
  10. DTO、QO、PO、BO分别是什么意思