BZOJ_1626_[Usaco2007_Dec]_Building_Roads_修建道路_(Kruskal)
描述
http://www.lydsy.com/JudgeOnline/problem.php?id=1626
给出\(n\)个点的坐标,其中一些点已经连通,现在要把所有点连通,求修路的最小长度.
分析
已经连好一些边的最小生成树问题.
这里顺带复习了一下Prim和Krusakal.
Prim的证明:
设当前已经连好的树为\(T\),当前最小的边为\(e\),我们来证明\(e\)一定在最小生成树\(G\)中.
假设\(e\)不在\(G\)中,则连通\(G-T\)和\(T\)的边\(e'\)一定比\(e\)大(或相等).此时我们在\(G\)中加入\(e\),会形成环,去掉环中的\(e'\),树依然连通,而花费更小了,这与\(G\)是最小生成树矛盾.(如果\(e\)与\(e'\)相等那么虽然花费不会更小,也就是说\(e\)可以不再\(G\)中,但是我们也可以用\(e\)替换\(e'\),换言之,\(e\)在\(G\)中是不错误的.)
所以\(e\)一定在最小生成树\(G\)中.
Kruskal的证明:
设当前连接两个不连通分量的最小的边为\(e\),我们来证明\(e\)一定在最小生成树\(G\)中.
假设\(e\)不再\(G\)中,则连通这两个分量的边\(e'\)一定比\(e\)大(或相等).此时我们 在\(G\)中加入\(e\),会形成环,去掉环中的\(e'\),树依然连通,而花费更小了,这与\(G\)是最小生成树矛盾.(如果\(e\)与 \(e'\)相等那么虽然花费不会更小,也就是说\(e\)可以不再\(G\)中,但是我们也可以用\(e\)替换\(e'\),换言之,\(e\)在 \(G\)中是不错误的.)
#include <bits/stdc++.h>
using namespace std; const int maxn=+;
struct pt{
double x,y;
pt(double x=,double y=):x(x),y(y){}
}p[maxn];
struct edge{
int from,to;
double d;
edge(){}
edge(int from,int to,double d):from(from),to(to),d(d){}
bool operator < (const edge &rhs) const { return d<rhs.d; }
}g[maxn*maxn];
int n,m,cnt=;
int f[maxn];
double ans;
inline double dis(pt a,pt b){ return sqrt(pow(a.x-b.x,)+pow(a.y-b.y,)); }
inline int find(int x){ return x==f[x]?x:f[x]=find(f[x]); }
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%lf%lf",&p[i].x,&p[i].y);
f[i]=i;
}
for(int i=;i<=m;i++){
int u,v; scanf("%d%d",&u,&v);
int fu=find(u),fv=find(v);
if(fu!=fv) f[fu]=fv,cnt++;
}
for(int i=;i<=n;i++)for(int j=;j<=n;j++) g[(i-)*n+j]=edge(i,j,dis(p[i],p[j]));
sort(g+,g++n*n);
int tot=n*n;
for(int i=;i<=tot,cnt<=n;i++){
int fx=find(g[i].from),fy=find(g[i].to);
if(fx!=fy){
f[fx]=fy;
ans+=dis(p[g[i].from],p[g[i].to]);
cnt++;
}
}
printf("%.2lf\n",ans);
return ;
}
BZOJ_1626_[Usaco2007_Dec]_Building_Roads_修建道路_(Kruskal)的更多相关文章
- 【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 修建道路:kruskal(最小生成树)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1626 题意: 有n个农场,坐标为(x[i],y[i]). 有m条原先就修好的路,连接农场( ...
- BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路( MST )
计算距离时平方爆了int结果就WA了一次...... ------------------------------------------------------------------------- ...
- bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路 -- 最小生成树
1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec Memory Limit: 64 MB Description Farmer J ...
- 【二分+SPFA】修建道路(road)
(四五年以前的老草稿,作为强迫症还是发布出来吧) 修建道路(road.pas/c/cpp) [问题描述] NOIP2012的参赛者LG异想天开打算修建一条磁悬浮列车的通道连接现代OI王国的首都(编号为 ...
- Codevs_1403_新三国争霸_(Kruskal+动态规划)
描述 http://codevs.cn/problem/1403/ 共t天,n个点,m条边,选择每条边要付出不同的代价,其中某些天某些边不能用,要保证每一天n个点都是连通的,如果换方案要付出额外的代价 ...
- [Usaco2007 Dec]Building Roads 修建道路
题目描述 Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场 ...
- BZOJ-1196 公路修建问题 最小生成树Kruskal+(二分??)
题目中一句话,最大费用最小,这么明显的二分的提示(by 以前morestep学长的经验传授)...但完全没二分,1A后感觉很虚.. 1196: [HNOI2006]公路修建问题 Time Limit: ...
- bzoj1626[Usaco2007 Dec]Building Roads 修建道路
Description Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农 ...
随机推荐
- POJ 1080 Human Gene Functions -- 动态规划(最长公共子序列)
题目地址:http://poj.org/problem?id=1080 Description It is well known that a human gene can be considered ...
- Qt-获取主机网络信息之QNetworkAddressEntry
QNetworkAddressEntry类存储了一个网络接口所支持的一个IP地址,同时还有与之相关的子网掩码和广播地址. 每个网络接口可以包含0个或多个IP地址,这些IP地址可以分别关联一个子网掩码和 ...
- 遍历 DataSet
DataSet ds=new DataSet ; //获取dataset的第一张table,取其他table只须改下标 DataTable dt=ds.tables[]; //遍历行 foreach( ...
- [C#]Array 添加扩展
众所周知,Array 一旦定义好,譬如四个长度,当需要再往里面添加元素的时候,需要Array.Resize一下才可以,为了提高代码复用,所以索性封装下,方便使用,代码如下: /// <summa ...
- 探究为何rem在chrome浏览器上计算出错
最近在一个项目中,测试同学提了一个bug,说手机上有个页面的某些字体显示偏大.就像这样 我用chrome浏览器在pc上测试了一下,发现pc上也有这个问题,但是用其它浏览器打开这个页面就没有发现这个问题 ...
- JavaScript的语法要点 2 - Scope Chain
前文所述,JavaScript是基于词法作用域(lexically scoped)的,所以标识符被固定在它们被定义的作用域而不是语法上或是其被调用时的作用域.即全局变量的作用域是整个程序,局部变量的作 ...
- oracle 11g实验五——触发器的使用
实验要求: 实验五 触发器的使用 实验目的 1. 理解触发器的概念.作用及分类: 2. 掌握触发器的创建.使用: 实验内容 1. 建立表orders:用于存储订单列表信息:表order_item ...
- Ubuntu Vim YouCompleteMe 安装
0. 必要工具安装 sudo apt-get install build-essential cmake 1. 安装 vundle mkdir ~/.vim/bundle git clone http ...
- C语言小结之结构类型
C语言小结之结构类型 @刁钻的游戏 (1)枚举型类型enum COLOR {BLACK,RED,BLUE};//声明一种新的数据类型,其值分别为0,1,2但是用BLACK/RED/BLUE代表也可以这 ...
- 2014年度辛星html教程夏季版第六节
不知道这样大家会不会感觉枯燥,总之不管大家怎么样,辛星始终会陪伴大家的,期待您的关注和支持,也衷心的希望我的博客能让您少走弯路,获得更系统的知识. ***************表格********* ...