洛谷 P2872 [USACO07DEC]道路建设Building Roads

洛谷传送门

JDOJ 2546: USACO 2007 Dec Silver 2.Building Roads

JDOJ传送门

Description

Farmer John had just acquired several new farms! He wants to connect

the farms with roads so that he can travel from any farm to any

other farm via a sequence of roads; roads already connect some of

the farms.

Each of the N (1 <= N <= 1,000) farms (conveniently numbered 1..N)

is represented by a position (X_i, Y_i) on the plane (0 <= X_i <=

1,000,000; 0 <= Y_i <= 1,000,000). Given the preexisting M roads

(1 <= M <= 1,000) as pairs of connected farms, help Farmer John

determine the smallest length of additional roads he must build to

connect all his farms.

Input

* Line 1: Two space-separated integers: N and M

* Lines 2..N+1: Two space-separated integers: X_i and Y_i

* Lines N+2..N+M+2: Two space-separated integers: i and j, indicating

that there is already a road connecting the farm i and farm j.

Output

* Line 1: Smallest length of additional roads required to connect all

farms, printed without rounding to two decimal places. Be sure

to calculate distances as 64-bit floating point numbers.

Sample Input

4 1 1 1 3 1 2 3 4 3 1 4

Sample Output

4.00

HINT

INPUT DETAILS:

Four farms at locations (1,1), (3,1), (2,3), and (4,3). Farms 1 and 4 are

connected by a road.

OUTPUT DETAILS:

Connect farms 1 and 2 with a road that is 2.00 units long, then connect

farms 3 and 4 with a road that is 2.00 units long. This is the best we can

do, and gives us a total of 4.00 unit lengths.

Source

2007~2008

题目翻译:

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)条路分别连接了哪两个农场,他希望你计算一下,为了使得所有农场连通,他所需建造道路的最小总长是多少。

题解:

一道最小生成树的题。

这题的大意就是,有一些已经建好的边,问你再建多长的边能够使原图有一个最小生成树。

如果我们先依照题意连边未免太恶心。

所以我们考虑更优秀的一种做法(其实是更巧妙

我们先给题目的边打标记,最后建全图,如果有标记的边我们把它的边权置成0,这样就保证它一定在最小生成树上。

所以就可以A了。

(我用的是KUSKAL)

代码:

#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int n,m,vis[1001],tot,fa[1001];
long double ans;
struct node
{
ll x,y;
}a[1001];
struct edge
{
int u,v;
long double val;
}e[1000001<<1];
long double dist(int x,int y,int a,int b)
{
return sqrt((long double)(x-a)*(long double)(x-a)+(long double)(y-b)*(long double)(y-b));
}
void add(int x,int y,int z)
{
e[++tot].u=x;
e[tot].v=y;
e[tot].val=z;
}
bool cmp(edge a,edge b)
{
if(a.val==b.val)
return a.u<b.u;
return a.val<b.val;
}
int find(int x)
{
if(fa[x]==x)
return x;
return fa[x]=find(fa[x]);
}
void unionn(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
fa[fx]=fy;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
vis[u]=vis[v]=1;
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
if(vis[i]==1 && vis[j]==1)
{
add(i,j,0);
add(j,i,0);
}
else
{
add(i,j,dist(a[i].x,a[i].y,a[j].x,a[j].y));
add(j,i,dist(a[i].x,a[i].y,a[j].x,a[j].y));
}
}
sort(e+1,e+tot+1,cmp);
for(int i=1;i<=tot;i++)
if(find(e[i].u)!=find(e[i].v))
{
ans+=e[i].val;
unionn(e[i].u,e[i].v);
}
printf("%.2lf",ans);
return 0;
}

USACO Building Roads的更多相关文章

  1. poj 3625 Building Roads

    题目连接 http://poj.org/problem?id=3625 Building Roads Description Farmer John had just acquired several ...

  2. poj 2749 Building roads (二分+拆点+2-sat)

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6229   Accepted: 2093 De ...

  3. BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路( MST )

    计算距离时平方爆了int结果就WA了一次...... ------------------------------------------------------------------------- ...

  4. HDU 1815, POJ 2749 Building roads(2-sat)

    HDU 1815, POJ 2749 Building roads pid=1815" target="_blank" style="">题目链 ...

  5. Building roads

    Building roads Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  6. bzoj1626 / P2872 [USACO07DEC]道路建设Building Roads

    P2872 [USACO07DEC]道路建设Building Roads kruskal求最小生成树. #include<iostream> #include<cstdio> ...

  7. [POJ2749]Building roads(2-SAT)

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8153   Accepted: 2772 De ...

  8. bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路 -- 最小生成树

    1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer J ...

  9. 洛谷——P2872 [USACO07DEC]道路建设Building Roads

    P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...

随机推荐

  1. webpack与vue环境搭建(转载)

    原文:https://www.cnblogs.com/lgx5/p/10732016.html npm安装教程   一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理 ...

  2. Kubernetes生产架构浅谈

    注意 本文,只是笔者针对Kubernetes生产环境运行的一些关于架构设计介绍. 介绍 基于 Kubernetes 系统构建的统一开发运维管控平台.在 Kubernetes 基础上,围绕 微服务系统的 ...

  3. python统计wav文件的时长

    import wave import os.path # 音频存放文件夹绝对路径 filedir = '/Users/111/PycharmProjects/TextClassify/wav' lis ...

  4. 多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了

    1.引言 对于即时通讯网来说,所有的技术文章和资料都在围绕即时通讯这个技术方向进行整理和分享,这一次也不例外.对于即时通讯系统(包括IM.消息推送系统等)来说,MQ消息中件间是非常常见的基础软件,但市 ...

  5. Appium移动自动化测试-----(三)Intellij IDEA + Android SDK + Genymotion Emulator

    下载安装Intellij IDEA 略 下载Android SDK http://tools.android-studio.org/index.php/sdk    下载后解压 http://www. ...

  6. 一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生

    在网络的初期,网民很少,服务器完全无压力,那时的技术也没有现在先进,通常用一个线程来全程跟踪处理一个请求.因为这样最简单. 其实代码实现大家都知道,就是服务器上有个ServerSocket在某个端口监 ...

  7. Docker入门学习及其安装

    1.Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源.Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的Linux机器 ...

  8. mongodb 更新数据时int32变为double的解决办法 & 教程

    https://www.runoob.com/mongodb/mongodb-mongodump-mongorestore.html mongodb 更新数据时int32变为double的解决办法   ...

  9. Activex在没有电子秤api的情况下获取串口数据

    大二做B/S架构的项目使用了安衡电子秤CHS-D+R和一款扫码枪,两个设备的串口使用一样,这款电子秤是相当的坑,没有开发的api,无奈只能自己开发Activex了,在B/S架构中进行引用Activex ...

  10. 解决U盘不能分配空间(windows下操作)

    亲测可行 1.WIN+R => cmd => diskpart命令进入工具. 2.使用LIST DISK查看所有磁盘,?提示所有命令. 3.SELECT DISK 1将磁盘聚焦到1号磁盘, ...