洛谷 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. lincense更新失败

    用户的证书到期,页面无法访问, 1 #/dashboard/systemindex在这里面上传证书文件,一分钟后会恢复正常 2 在后台直接配置license字段,将license文件的内容直接拷贝过去 ...

  2. python-10-列表、元组嵌套

    前言 元组.列表前面章节有讲解实例,本节内容是列表.元组的多嵌套. 一.列表嵌套 1.列表嵌套操作1 # 列表的嵌套 li = ['xiaolong', '小林', ['小龙', 'xiaol'], ...

  3. 【Linux命令】at、crontab定时任务

    crontab定时任务(周期性) 一.简介 通过crontab命令可以在固定的间隔执行系统指令或shell脚本 二.crontab配置文件: Linux下的任务调度分为两类:系统任务调度和用户任务调度 ...

  4. Nginx Cache-Control

    转自:https://www.cnblogs.com/sfnz/p/5383647.html HTTP协议的Cache-Control指定请求和响应遵循的缓存机制.在请求消息或响应消息中设置 Cach ...

  5. 解决MybatisPlus修改时空字段不修改问题

    今天遇到了一个问题,在更新数据时,MybatisPlus不会进行修改属性为空的数据表字段. 解决办法: 只需要在实体类的属性上加一行注释即可 /** * 姓名 */ @TableField(fill ...

  6. 第一届云原生应用大赛火热报名中! helm install “一键安装”应用触手可及!

    云原生应用,是指符合“云原生”理念的应用开发与交付模式,这是当前在云时代最受欢迎的应用开发最佳实践. 在现今的云原生生态当中,已经有很多成熟的开源软件被制作成了 Helm Charts,使得用户可以非 ...

  7. Prometheus K8S中部署Alertmanager

    Prometheus K8S中部署Alertmanager 设置告警和通知的主要步骤如下:一.部署Alertmanager二.配置Prometheus与Alertmanager通信三.配置告警 1. ...

  8. C#学习之委托与事件

    委托 语法:  public  delegate void MyDelegate(); 使用:  1.定义委托----public  delegate void MyDelegate(); 2.注册委 ...

  9. git 使用 tortoisegit 解冲突

    git 解冲突需要注意的问题 弄清除冲突双向的修改意图,并在解决冲突时,同时处理两边的意图. 举例说明 A.txt 文件, 在 master 分支上,有一行文字(代码)是这样: 这是一段在 maste ...

  10. C# - VS2019调用ZXing.NET实现条码、二维码和带有Logo的二维码生成

    前言 C# WinFrm程序调用ZXing.NET实现条码.二维码和带有Logo的二维码生成. ZXing.NET导入 GitHub开源库 ZXing.NET开源库githib下载地址:https:/ ...