洛谷 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. C getchar()

    C getchar() #include <stdio.h> int main() { ; char str[size]; ; char ch; printf("Enter wh ...

  2. oracle用户管理, 授权与回收权限

    一. 用户管理参数, 0.删除用户: drop user 用户名 [cascade] 当我们删除用户时, 如改用户已创建过数据对象, 那么删除用户时必须加cascade参数, 用来同步删除 改用户的所 ...

  3. Paper | BLIND QUALITY ASSESSMENT OF COMPRESSED IMAGES VIA PSEUDO STRUCTURAL SIMILARITY

    目录 1. 技术细节 1.1 得到MDI 1.2 判别伪结构,计算伪结构相似性 2. 实验 动机:作者认为,基于块的压缩会产生一种伪结构(pseudo structures),并且不同程度压缩产生的伪 ...

  4. Deepin安装与配置

    前言 今年参加CSP-S时仍不太习惯系统,深究其原因,我之前一直是一种应试的心态去学习Linux,学习的大多操作只是为了应试,而非为了"生存"下来,只有能完全摆脱Windows,在 ...

  5. IDA分析时添加新的C语言结构体

    View - Open Subviews - Local Type - INSERT键 - 输入新结构体 - 右击"Synchornize to idb" 之后再分析处按 T 就可 ...

  6. dedecms5.7文章页替换掉特定标志的图片链接

    dedecms5.7文章页的替换掉特定标志的图片链接 解决思路 1个是在数据库里面执行替换操作 我自己查看 织梦后台也有这个功能  但是执行了一次 效果不是很好  那么就用下面的  在模板中进行内容替 ...

  7. Prism——Window 必须是树的根目录。不能将 Window 添加为 Visual 的子目录。

    这个错误就是作为Region的view添加时选成了界面,正确的应在添加时选择用户控件. 解决方法: 这俩处的Window改为UserControl即可.

  8. 3、Ext.NET 1.7 官方示例笔记-表单

    表单[Form],就是向客户收集资料的窗口,用户在表单填写好各种信息,然后提交到服务器,服务器接收并保存到数据库里. 表单的字段类型很多,我们从最简单的开始吧. 1.1 .先开始组合框吧(ComboB ...

  9. Python 电子邮件

    从一台计算机编写邮件到对方收到邮件.假设我们自己的电子邮件地址是me@163.com,对方的电子邮件地址是friend@sina.com 我们在本地的软件上写好邮件,点击发送,邮件就发送出去了,这些电 ...

  10. 探究java对象头

    探究java对象头 研究java对象头,我这里先截取Hotspot中关于对象头的描述,本文研究基于64-bit HotSpot VM 文件路径 openjdk-jdk8u-jdk8u\hotspot\ ...