洛谷P1265 公路修建(Prim)
题目描述
某国有n个城市,它们互相之间没有公路相通,因此交通十分不便。为解决这一“行路难”的问题,政府决定修建公路。修建公路的任务由各城市共同完成。
修建工程分若干轮完成。在每一轮中,每个城市选择一个与它最近的城市,申请修建通往该城市的公路。政府负责审批这些申请以决定是否同意修建。
政府审批的规则如下:
(1)如果两个或以上城市申请修建同一条公路,则让它们共同修建;
(2)如果三个或以上的城市申请修建的公路成环。如下图,A申请修建公路AB,B申请修建公路BC,C申请修建公路CA。则政府将否决其中最短的一条公路的修建申请;
(3)其他情况的申请一律同意。
一轮修建结束后,可能会有若干城市可以通过公路直接或间接相连。这些可以互相:连通的城市即组成“城市联盟”。在下一轮修建中,每个“城市联盟”将被看作一个城市,发挥一个城市的作用。
当所有城市被组合成一个“城市联盟”时,修建工程也就完成了。
你的任务是根据城市的分布和前面讲到的规则,计算出将要修建的公路总长度。
输入输出格式
输入格式:
第一行一个整数n,表示城市的数量。(n≤5000)
以下n行,每行两个整数x和y,表示一个城市的坐标。(-1000000≤x,y≤1000000)
输出格式:
一个实数,四舍五入保留两位小数,表示公路总长。(保证有惟一解)
输入输出样例
4
0 0
1 2
-1 2
0 4
6.47
说明
修建的公路如图所示:
思路:
规则2是没有用的,因为不可能存在三个及以上个城市形成环。按“轮”处理也没有必要,因此这就成了一道求最小生成树的题。
如果用Kruskal需用5000*5000的矩阵先计算出边,肯定是超内存的。所以选择Prim,在求最小生成树过程中计算两点距离。
代码:
#include<cmath>
#include<cstdio>
using namespace std;
const int N=; int n,x[N],y[N];
double Ans,Min[N];
bool vis[N]; void read(int &now)
{
now=;bool f=;char c=getchar();
while(c>''||c<'')
{
if(c=='-')f=;
c=getchar();
}
while(c>=''&&c<='')now=(now<<)+(now<<)+c-'',c=getchar();
now= f?-now:now;
} double Calu(int a1,int b1,int a2,int b2)
{
return sqrt((double)(a1-a2)*(a1-a2)+(double)(b1-b2)*(b1-b2));
//因为这里的自乘很可能爆int,改成longlong也不是不可以但耗内存,so 转换成double
} int main()
{
read(n);
for(int i=;i<=n;++i)
read(x[i]),read(y[i]),Min[i]=1e9;
Min[]=;
for(int i=;i<=n;++i)
{
double k=1e9;int cur=;
for(int j=;j<=n;++j)
if(!vis[j] && k>Min[j])
{
k=Min[j];cur=j;
}
vis[cur]=;
Ans+=k;
for(int j=;j<=n;++j)
{
if(vis[j])continue;
double t=Calu(x[cur],y[cur],x[j],y[j]);
if(Min[j]>t)
Min[j]=t;
}
}
printf("%.2lf",Ans);
return ;
}
洛谷P1265 公路修建(Prim)的更多相关文章
- 洛谷P1265 公路修建——prim
给一手链接 https://www.luogu.com.cn/problem/P1265 这道题本质上就是最小生成树,题目描述就是prim的思想 TIP:注意稠密图和稀疏图的区别 #include&l ...
- 洛谷P1265 公路修建
P1265 公路修建 177通过 600提交 题目提供者该用户不存在 标签图论 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 long long类型赋值-1为什么… p党80的进 为什么不过 ...
- 洛谷——P1265 公路修建
P1265 公路修建 题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一“行路难”的问题,政府决定修建公路.修建公路的任务由各城市共同完成. 修建工程分若干轮完成.在每一 ...
- 洛谷P1265 公路修建题解
题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一“行路难”的问题,政府决定修建公路.修建公路的任务由各城市共同完成. 修建工程分若干轮完成.在每一轮中,每个城市选择一个 ...
- 洛谷 [P1265] 公路修建
本题的描述:城市联盟,最短距离.. 使人想到了prim求MST,再一看数据范围:完全图!,那么一定得用prim,因为只有5000个点,所以不加优化的prim就能过. #include <iost ...
- P1265 公路修建 (prim)
题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一"行路难"的问题,政府决定修建公路.修建公路的任务由各城市共同完成. 修建工程分若干轮完成.在每一轮 ...
- 洛谷P2242 公路维修问题
To 洛谷.2242 公路维修问题 题目描述 由于长期没有得到维修,A国的高速公路上出现了N个坑.为了尽快填补好这N个坑,A国决定对M处地段采取交通管制.为了求解方便,假设A国的高速公路只有一条,而且 ...
- 【洛谷P1265】公路修建
公路修建 题目链接 分析题意,可以发现,在(1)的条件下,(2)的情况是不会发生的, 于是直接求MST(Min Set Tree) 然而稠密图克鲁斯卡尔会TLE,建图还会爆空间, 所以用prime,用 ...
- P1265 公路修建 洛谷
https://www.luogu.org/problem/show?pid=1265 题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一“行路难”的问题,政府决定修建公 ...
随机推荐
- EXT3.3.1在IE9 IE10click事件 失效怎么解决
各位Ext君有福了. var treePanel = new Ext.tree.TreePanel({ id:'treePanel_'+(menuIndex++),//让菜单id可控 title: t ...
- linux 高级字符设备驱动 ioctl操作介绍 例程分析实现【转】
转自:http://my.oschina.net/u/274829/blog/285014 1,ioctl介绍 ioctl控制设备读写数据以及关闭等. 用户空间函数原型:int ioctl(int f ...
- scrapy通过修改配置文件发送状态邮件
EXTENSIONS = { 'scrapy.extensions.statsmailer.StatsMailer': 500,} STATSMAILER_RCPTS = ['159882826 ...
- openstack swift节点安装手册3-最后的安装配置及验证
以下步骤都在controller节点上执行 1.远程获取/etc/swift/swift.conf文件: curl -o /etc/swift/swift.conf https://git.opens ...
- 学习笔记_Cocos Creator_继承组件单例
官方文档:https://docs.cocos.com/creator/manual/zh/scripting/reference/class.html 前言 单例,在游戏开发中是比较常用的功能,全局 ...
- 部署vCenter Server Appliance 6.7
=============================================== 2019/4/14_第1次修改 ccb_warlock == ...
- Ex 6_20 最优二叉搜索树..._第六次作业
假设关键字的总数为n,用c[i,j]表示第i个关键字到第j个关键字的最优二叉查找树的代价,我们的目标是求c[0,n-1].要求c[i,j],首先要从第i个关键字到第j个关键字中选一个出来作为根结点,选 ...
- PYTHON-流程控制之if/while/for-练习
# 1 练习题## 简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型# 编译型:C, 谷歌翻译,一次翻译后结果后重复使用# 解释型:Python, 同声传译,边执行边 ...
- 手机端的1px边框如何实现
(1).把边框设置为absolute,使用after,定义宽度为1px(mixin.styl) (2).通过@media,判断不同的dpi,来改变相应的Y轴宽度(base.styl),定义公共clas ...
- node调试工具--nodemon