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\)中是不错误的.)
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1000+5; 5 struct pt{ 6 double x,y; 7 pt(double x=0,double y=0):x(x),y(y){} 8 }p[maxn]; 9 struct edge{ 10 int from,to; 11 double d; 12 edge(){} 13 edge(int from,int to,double d):from(from),to(to),d(d){} 14 bool operator < (const edge &rhs) const { return d<rhs.d; } 15 }g[maxn*maxn]; 16 int n,m,cnt=1; 17 int f[maxn]; 18 double ans; 19 inline double dis(pt a,pt b){ return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)); } 20 inline int find(int x){ return x==f[x]?x:f[x]=find(f[x]); } 21 int main(){ 22 scanf("%d%d",&n,&m); 23 for(int i=1;i<=n;i++){ 24 scanf("%lf%lf",&p[i].x,&p[i].y); 25 f[i]=i; 26 } 27 for(int i=1;i<=m;i++){ 28 int u,v; scanf("%d%d",&u,&v); 29 int fu=find(u),fv=find(v); 30 if(fu!=fv) f[fu]=fv,cnt++; 31 } 32 for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) g[(i-1)*n+j]=edge(i,j,dis(p[i],p[j])); 33 sort(g+1,g+1+n*n); 34 int tot=n*n; 35 for(int i=1;i<=tot,cnt<=n;i++){ 36 int fx=find(g[i].from),fy=find(g[i].to); 37 if(fx!=fy){ 38 f[fx]=fy; 39 ans+=dis(p[g[i].from],p[g[i].to]); 40 cnt++; 41 } 42 } 43 printf("%.2lf\n",ans); 44 return 0; 45 }
View Code
转载于:https://www.cnblogs.com/Sunnie69/p/5581419.html
BZOJ_1626_[Usaco2007_Dec]_Building_Roads_修建道路_(Kruskal)相关推荐
- [BZOJ1626][Usaco2007 Dec]Building Roads 修建道路
1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1730 Solved ...
- 7-14 修建道路 (10 分)
7-14 修建道路 (10 分) N个村庄,从1到N编号,现在请您兴建一些路使得任何两个村庄彼此连通.我们称村庄A和B是连通的,当且仅当在A和B之间存在一条路,或者存在一个存在C,使得A和C之间有一条 ...
- bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路(最小生成树)
1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1709 Solved ...
- poj2421修建道路
题目 有N个村庄,编号从1到N,你应该建造一些道路,这样每两个村庄就可以相互连接.我们说两个村庄A和B是相连的,当且仅当A和B之间有一条路,或者存在一个村庄C,使得A和C之间有一条路,C和B是相连的. ...
- 【考题 题解】奇怪机器人单词方阵修建道路
前言 欢迎关注我(小周猪猪)的博客,同时也欢迎关注为你们讲解的乔治大佬(心畅)的博客.如果对于原来的考试,你有不会的题,可以参考数字游戏题解,搜索题解,递归地推题解或者更多讲课内容的笔记与讲解. 1. ...
- 光伏智能道路_这条光伏公路,能承重,晒太阳能发电,西方国家:中国技术好...
晒晒太阳就能发电,电动汽车跑在上面就能充电,下雪后还能自行融化路面积雪,这就是中国已经建成的又一个超级工程,世界首条光伏公路. 2017年,济南南绕城高速公路建设完成,成为世界首条承载光伏路面的高速公 ...
- 提取地图中道路_逼疯谷歌地球!我用神器一键提取各种肌理,还能生成3D模型!...
点击文末「在看」「赞」,我们将第一时间出现在你面前 每天8:15,设计气象台准时为你带来最新黑科技干货知识 前期分析好做吗?看到这个问题,你可能会想,不就网上随便截个地图P一P嘛,有多难? 那比如说, ...
- 提取地图中道路_非机器学习方法·从遥感影像中提取道路
本科低年级曾经做过一个提取道路线的题目. 提供的数据:老师给我们了一幅学校周边地区的影像,包括RGB+Infrared四个波段. 一开始使用的方法:当时尚青涩的我和小伙伴们一起使用KMEANS.阈值分 ...
- BZOJ——1626: [Usaco2007 Dec]Building Roads 修建道路
http://www.lydsy.com/JudgeOnline/problem.php?id=1626 Time Limit: 5 Sec Memory Limit: 64 MB Submit: ...
- 修建道路(最小生成树)
N个村庄,从1到N编号,现在请您兴建一些路使得任何两个村庄彼此连通.我们称村庄A和B是连通的,当且仅当在A和B之间存在一条路,或者存在一个存在C,使得A和C之间有一条路,并且C和B是连通的. 已知在一 ...
最新文章
- springJDBC实现查询方法二
- 前端实习生笔试_一道来自美图的实习生前端笔试算法题
- 当对项目强名时自动构建失败(TeamFoudationServer试用笔记)
- Redis和mysql数据怎么保持数据一致的?
- PHP——使用PHPMailer实现PHP发邮件功能
- RStudio快捷键
- 遍历opencv中的mat像素的几种方法和概念
- Linux C语言 文件操作
- 西安石油大学计算机基础考试试题,2017年西安石油大学计算机学院824计算机组成原理考研题库...
- 设计模式解密(12)- 桥接模式
- 浅谈Oracle绑定变量
- 算法总结之 生成窗口的最大值数组
- 机器人工程师学习计划(新工科自学方案)------杨硕
- Rose与PowerDesigner:两款UML建模工具的对比
- 8K HDR!|为 Chromium 实现 HEVC 硬解 - 原理/实测指南
- CytusII 剧情梳理
- Android 实现搜索历史(1)
- 在方框里打勾 microsoft office
- 15nm粒径球形纳米金AuNPs-Thrombin修饰R-藻红蛋白/阿霉素的制备过程
- r语言导出文件为xlxs_R语言数据导出到Excel表格-如何将R语言中的表格数据输出为Excel文件...