151. [USACO Dec07] 建造路径

★★   输入文件:roads.in   输出文件:roads.out   简单对比

时间限制:1 s   内存限制:128 MB

译 by CmYkRgB123

描述

Farmer John 刚刚得到了几个新农场!他想把这几个农场用路连接起来,这样他就可以通过笔直的公路从一个农场到另一个农场了。现在已经有了几条连接着的农场。

N (1 ≤ N ≤ 1,000) 个农场中,每个农场的位置在坐标平面的 (Xi, Yi) (0 ≤ Xi ≤ 1,000,000; 0 ≤ Yi ≤ 1,000,000)。已经有 M (1 ≤ M ≤ 1,000) 条路以前就被建好了。请你帮助 Farmer John 考虑建设尽量少长度的额外的路,使他的农场连在一起。

输入

* 第 1 行: 两个整数: N , M
* 第 2..N+1 行: 两个整数 Xi , Yi
* 第 N+2..N+M+2 行: 两个整数: i , j, 表示已经存在从农场i到农场j的路。

输出

* 第 1 行: 额外的路的最少长度,保留2小数。 请使用 64 位的浮点数。

样例输入

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

样例输出

4.00

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>

using namespace std;
const int N=1010;

bool vis[N][N];
int fa[N];
int n,m,js,xx,yy,tot,total;
double answer;
struct node{
	double x,y;
}E[N];
struct NODE{
	int st,ed;
	double dis;
}EE[500000];

inline int read()
{
	int x=0;char c=getchar();
	while(c<‘0‘||c>‘9‘)c=getchar();
	while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar();
	return x;
}

inline double calc(int a,int b)
{
	return sqrt(abs(E[a].x-E[b].x)*abs(E[a].x-E[b].x)+abs(E[a].y-E[b].y)*abs(E[a].y-E[b].y));
}

bool cmp(NODE a,NODE b)
{
	return a.dis<b.dis;
}

int getfa(int x)
{
	return fa[x]==x?x:fa[x]=getfa(fa[x]);
}

int main()
{
	freopen("roads.in","r",stdin);
	freopen("roads.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		fa[i]=i,scanf("%lf%lf",&E[i].x,&E[i].y);
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			EE[++js].st=i,
			EE[js].ed=j,
			EE[js].dis=calc(i,j);

	for(int i=1;i<=m;i++)
		xx=read(),
		yy=read(),
		vis[xx][yy]=vis[yy][xx]=1;

	for(int i=1;i<=js;i++)
		if(vis[EE[i].st][EE[i].ed])
		{
			int fx=getfa(EE[i].st);
			int fy=getfa(EE[i].ed);
			fa[fx]=fy;
			EE[i].dis=double(N<<4);
		}
	tot=n-1-m;
	sort(EE+1,EE+js+1,cmp);
	for(int i=1;i<=js;i++)
	{
		int fx=getfa(EE[i].st);
		int fy=getfa(EE[i].ed);
		if(fx!=fy)
		{
			fa[fx]=fy;
			total++;
			answer+=EE[i].dis;
			if(total==tot)
				break;
		}
	}
	printf("%.2lf",answer);
	return 0;
}

  

时间: 2024-10-28 17:54:02

151. [USACO Dec07] 建造路径的相关文章

USACO 2007 December Contest, Silver Problem 2. Building Roads Kruskal最小生成树算法

PROBLEM: (ENGLISH VERSION) 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

[SinGuLaRiTy] 树链问题

[SinGuLaRiTy-1035] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 关于树链 树链是什么?这个乍一看似乎很陌生的词汇表达的其实就是在一棵树中从一个节点到另外一个节点的路径.在许多看似复杂的图论问题中,我们实际上只要对其进行适当的处理,把图转化为一棵树,问题就会得到化简,再运用树链的相关思想就可以较为轻松地解决. 树上倍增 所谓的“树上倍增”,其实就是一种记录节点的方法.我们定义一个数组f[i][j],表示节点i的第2^j

hihocoder 1584 Bounce (数学 &amp;&amp; 规律) ACM-ICPC北京赛区2017网络赛

题意: 给定一副n*m的格子图, 问从左上角的点开始往右下角滑,碰到墙壁就反弹, 碰到角落就停止, 问恰好经过一次的格子有多少个. 如图,恰好经过一次的格子有39个. 分析: 首先要引入两个概念, "路径长","格子数". 路径长指的是整段路程的长度,如果走过同一个格子两次那么就算是2步. 格子数指的是整段路程经过的格子. 如果一个图是9*9(形如n*n)的, 那么就是从左上角一直到右下角, 走过的"路径长"恰好等于"格子数"

python 第七章 模块

模块 一个py文件就是一个模块模块一共三种:1.python标准库 2.第三方模块 3.应用程序自定义模块 import:1.执行对应文件 2.引入变量名if__name__="__main__": #1.用于被调用文件测试 2.防止主程序被调用 time模块 常用命令 时间模块 1 import time 2 #时间戳: 3 print(time.tiem()) 4 5 #结构化时间(当地): 6 t =time.localtime(time.tiem()) 7 print(t) 8

15-1有向无环图中的最长路径

#ifndef LONG_PATH_H #define LONG_PATH_H #include<iostream> #include<string> #define MAX 65535 int graphPath_longest(int (*Graph)[5],int Length,int origin,int destin ); void printf_path(int origin,int destin); #endif #include"LongPath.h&qu

[usaco jan 09] 安全路径 travel [最短路径树]

题面: 传送门 思路: 既然最后一条边不能走,那么就一定是换了一条路,一条不经过这最后一条边的路 如果想要这条路最短,那么其在路上一定尽可能多地走了最短路径 因此,我们对这张图跑一遍从1开始的单源最短路,并建立出最短路径树 那么新的路径(1->u)一定是这样构成的:(1->v)+edge(v,w)+(w->u),其中w是u在最短路径树上的后代 那么,我们对于每一条非树边(u,v),其树上路径上所有点(除了lca)的答案,都可以被dis[u]+dis[v]+w(u,v)-dis[路径上的点

求一个有向无换图中,最长简单路径。动态规划问题15-1

package com.li.chapter15.Prictice; /** * 练习题1: 求有向无环图两点路径的最大值. * * 思路: 给定有向无环图的矩阵, 从1-n的最长距离,2-n的最长距离... * * maxLength[i,j]=maxlenth[i,j-1]+length[j] //length[j]是与终点相连的很多点之一.最大的一个. */ public class Question01 { public static void main(String[] args){

luogu题解 P2860[USACO冗余路径Redundant Paths] 缩点+桥

题目链接 https://www.luogu.org/problemnew/show/P2860 https://www.lydsy.com/JudgeOnline/problem.php?id=1718 分析 首先这题目的意思就是让任意两点之间至少有两条没有重复道路的路径,很显然,如果这个图不存在桥,就一定满足上述条件. 于是我们就是要求使这个图不存在桥需要连接的最小边数 如果把桥从图中去掉,很显然剩余的联通块中任意两点之间至少有两条没有重复道路的路径(当然也可能不是联通块而是孤立的点),对答

建造道路 (Building Roads, USACO 2007 Dec)

题目描述 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