[Usaco2007 Dec]Building Roads 修建道路[最小生成树]
Description
Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场)。有些农场之间原本就有道路相连。 所有N(1 <= N <= 1,000)个农场(用1..N顺次编号)在地图上都表示为坐标为(X_i, Y_i)的点(0 <= X_i <= 1,000,000;0 <= Y_i <= 1,000,000),两个农场间道路的长度自然就是代表它们的点之间的距离。现在Farmer John也告诉了你农场间原有的M(1 <= M <= 1,000)条路分别连接了哪两个农场,他希望你计算一下,为了使得所有农场连通,他所需建造道路的最小总长是多少。
Input
* 第1行: 2个用空格隔开的整数:N 和 M
* 第2..N+1行: 第i+1行为2个用空格隔开的整数:X_i、Y_i * 第N+2..N+M+2行: 每行用2个以空格隔开的整数i、j描述了一条已有的道路, 这条道路连接了农场i和农场j
Output
* 第1行: 输出使所有农场连通所需建设道路的最小总长,保留2位小数,不必做 任何额外的取整操作。为了避免精度误差,计算农场间距离及答案时 请使用64位实型变量
Sample Input
1 1
3 1
2 3
4 3
1 4
输入说明:
FJ一共有4个坐标分别为(1,1),(3,1),(2,3),(4,3)的农场。农场1和农场
4之间原本就有道路相连。
Sample Output
输出说明:
FJ选择在农场1和农场2间建一条长度为2.00的道路,在农场3和农场4间建一
条长度为2.00的道路。这样,所建道路的总长为4.00,并且这是所有方案中道路
总长最小的一种。
本来快写完的题解= = 结果win7更新的时候按到重启了QAQ 没保存...想哭
算了。。再写一份好了
题解:
看到题目中的 使所有点连通并且使总值最小,就应该想到最小生成树,这个应该很容易吧?
我先把任意一个点到除它本身以外的所有点的距离(也就是边权)都求出来,把相连的两个结点之间的边权赋为0
然后就是按照裸的最小生成树写即可;
MARK一下细节:
这题最开始测试的时候WA了三个点,调试一下发现dist的值有的为 -nan0cx00000
问了一下学长,据说是因为除以0或是爆范围才会这种奇怪的值
分别断点之后发现是在求两点之间的距离的时候
double d(int x1,int y1,int x2,int y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
(x1-x2)*(x1-x2)就已经爆int了
之后把int 改成了 long long 就愉快的A了
感觉这种爆范围的地方特别要小心,上次CF的某道题mod的时候都会爆int,比较坑....
附上代码:
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <iostream>
- #include <cmath>
- #include <string>
- using namespace std;
- const int maxn=1001;
- int n,m;
- struct node{
- int x,y;
- }a[maxn];
- int fa[maxn*maxn];
- int x,y;
- struct kru{
- int num1,num2;
- double dist;
- }f[maxn*maxn];
- int tot=0;
- double ans=0;
- bool cmp(const kru &a,const kru &b){
- return a.dist<b.dist?1:0;
- }
- double d(long long x1,long long y1,long long x2,long long y2){
- return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
- }
- int find(int x){
- if(fa[x]==x) return x; else return fa[x]=find(fa[x]);
- }
- int main(){
- freopen("roads.in","r",stdin);
- freopen("roads.out","w",stdout);
- //freopen("data.txt","r",stdin);
- scanf("%d%d",&n,&m);
- for(int i=1;i<=n;i++) fa[i]=i;
- for(int i=1;i<=n;i++){
- scanf("%d%d",&a[i].x,&a[i].y);
- }
- for(int i=1;i<=m;i++){
- scanf("%d%d",&x,&y);
- f[++tot].num1=x;
- f[tot].num2=y;
- f[tot].dist=0;
- }
- for(int i=1;i<=n;i++)
- for(int j=i+1;j<=n;j++){
- f[++tot].num1=i;
- f[tot].num2=j;
- f[tot].dist=d(a[i].x,a[i].y,a[j].x,a[j].y);
- }
- sort(f+1,f+tot+1,cmp);
- int k=0;
- for(int i=1;i<=tot;i++){
- int u=f[i].num1;
- int v=f[i].num2;
- if(find(u)!=find(v)){
- ans+=f[i].dist;
- fa[find(u)]=find(v);
- k++;
- }
- if(k==n-1) break;
- }
- printf("%.2f",ans);
- return 0;
- }
[Usaco2007 Dec]Building Roads 修建道路[最小生成树]的更多相关文章
- bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路 -- 最小生成树
1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec Memory Limit: 64 MB Description Farmer J ...
- BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路( MST )
计算距离时平方爆了int结果就WA了一次...... ------------------------------------------------------------------------- ...
- BZOJ 1626 [Usaco2007 Dec]Building Roads 修建道路:kruskal(最小生成树)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1626 题意: 有n个农场,坐标为(x[i],y[i]). 有m条原先就修好的路,连接农场( ...
- bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路【最小生成树】
先把已有的边并查集了,然后MST即可 记得开double #include<iostream> #include<cstdio> #include<algorithm&g ...
- bzoj1626[Usaco2007 Dec]Building Roads 修建道路
Description Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农 ...
- [Usaco2007 Dec]Building Roads 修建道路
题目描述 Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场 ...
- 【BZOJ】1626: [Usaco2007 Dec]Building Roads 修建道路(kruskal)
http://www.lydsy.com/JudgeOnline/problem.php?id=1626 依旧是水题..太水了.. #include <cstdio> #include & ...
- BZOJ——1626: [Usaco2007 Dec]Building Roads 修建道路
http://www.lydsy.com/JudgeOnline/problem.php?id=1626 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1 ...
- bzoj1626 / P2872 [USACO07DEC]道路建设Building Roads
P2872 [USACO07DEC]道路建设Building Roads kruskal求最小生成树. #include<iostream> #include<cstdio> ...
随机推荐
- 虚拟化(一):虚拟化和vmware产品描述
由于公司最近取得了虚拟化监控,因此,我们需要虚拟化的认识,总结学习,对于虚拟化的概念.从百度百科,例如下列: 虚拟化.是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上 ...
- 如何使用Ubuntu打电话
在这个视频,我们学习如何使用Ubuntu打电话.Ubuntu手机的很多用户谁是不是很熟悉. 特别是,他什么都无所谓的物理按键(菜单键.home纽带.回车键).然后用户如何控制手机它?Ubuntu手机凭 ...
- SQL于DML(数据库操作语言)采用
1.Insert语句: INSERT [INTO] table [(column1, column2, column3, . . .)] VALUES(value1, value2, value3, ...
- hdu1881 毕业bg(深搜索dfs)
主题链接:pid=1881">http://acm.hdu.edu.cn/showproblem.php? pid=1881 ----------------------------- ...
- crawler_java_数据平台结构
大数据生态架构
- 前端学习笔记(zepto或jquery)——对li标签的相关操作(四)
对li标签的相关操作——五种方式给奇数项li标签设置样式 demo演示: 1 2 3 4 5 6 7 // 详解: 通常我们为多个li添加样式时常用的是使用filter,但我们在第三节中可以看到fil ...
- jquery 直接调用 wcf,面向服务的SOA架构 ( 第二天)
在前面的基础上,我们来开始第二天编写 客户端 的东西,不过讲之前,我想告诉大家的是: 这个简单的SOA的架构,我们直接通过wcf 调用到 后台的方法, 而中间没有使用 C#代码,大大减少我们客户端的代 ...
- [CLR via C#]5.2 引用类型和值类型
原文:[CLR via C#]5.2 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型.引用类型总是在托管堆上分配的,C#的ne ...
- 【转】简述什么是Web服务(Web Service)技术?
Web Service 是在 Internet 上进行分布式计算的基本构造块,是组件对象技术在 Internet 中的延伸,是一种部署在Web 上的组件.它融合了以组件为基础的开发模式和 ...
- 关于SelectedItems的问题
在做俄罗斯方块的时候写了以下一段代码: private void listView1_SelectedIndexChanged(object sender, EventArgs e) { ...