[bzoj1626][Usaco2007 Dec][最小生成树]修建道路
来源:互联网 发布:jsp企业门户网站源码 编辑:程序博客网 时间:2024/05/20 08:01
Description
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)条路分别连接了哪两个农场,他希望你计算一下,为了使得所有农场连通,他所需建造道路的最小总长是多少。
Input
第1行: 2个用空格隔开的整数:N 和 M
- 第2..N+1行: 第i+1行为2个用空格隔开的整数:X_i、Y_i * 第N+2..N+M+2行:
每行用2个以空格隔开的整数i、j描述了一条已有的道路, 这条道路连接了农场i和农场j
Output
- 第1行: 输出使所有农场连通所需建设道路的最小总长,保留2位小数,不必做 任何额外的取整操作。为了避免精度误差,计算农场间距离及答案时 请使用64位实型变量
Sample Input
4 1
1 1
3 1
2 3
4 3
1 4
输入说明:
FJ一共有4个坐标分别为(1,1),(3,1),(2,3),(4,3)的农场。农场1和农场
4之间原本就有道路相连。
Sample Output
4.00
输出说明:
FJ选择在农场1和农场2间建一条长度为2.00的道路,在农场3和农场4间建一
条长度为2.00的道路。这样,所建道路的总长为4.00,并且这是所有方案中道路
总长最小的一种。
题解
一眼,最小生成树嘛
原有的边就通通用上,然后把两个点并到一个联通块去
之后,我们n^2枚举点,查找他们是否在同一联通块中。如果不是就加一条边,顺带算出dis
之后跑最小生成树就好
#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>using namespace std;int fa[1100];struct point{ int x,y;}a[11000];struct edge{ int p,q;double dis;}e[1100000];int len;double dis(edge u){return sqrt(double(a[u.p].x-a[u.q].x)*double(a[u.p].x-a[u.q].x)+double(a[u.p].y-a[u.q].y)*double(a[u.p].y-a[u.q].y));}int n,m;int findfa(int x){ if(x!=fa[x])fa[x]=findfa(fa[x]); return fa[x];}bool cmp(edge n1,edge n2){return n1.dis<n2.dis;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){scanf("%d%d",&a[i].x,&a[i].y);fa[i]=i;} for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); int p=findfa(u),q=findfa(v); if(p!=q)fa[p]=q; } len=0; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { int p=findfa(i),q=findfa(j); if(p!=q) { len++; e[len].p=i;e[len].q=j; e[len].dis=dis(e[len]); } } sort(e+1,e+1+len,cmp); int tot=0; for(int i=1;i<=n;i++)if(fa[i]==i)tot++; double ans=0.0; for(int i=1;i<=len;i++) { int u=findfa(e[i].p),v=findfa(e[i].q); if(u!=v){fa[u]=v;ans+=e[i].dis;tot--;} if(tot==1)break; } printf("%.2lf\n",ans); return 0;}
阅读全文
0 0
- [bzoj1626][Usaco2007 Dec][最小生成树]修建道路
- bzoj1626[Usaco2007 Dec]Building Roads 修建道路
- [BZOJ1626] [Usaco2007 Dec]Building Roads 修建道路
- bzoj1626【Usaco2007 Dec】Building Roads 修建道路
- Cpp环境【BZOJ1626】【Usaco2007 Dec】【Vijos 1693】 修建道路
- bzoj1626 [Usaco2007 Dec]Building Roads 修建道路(kruskal裸题)
- 最小生成树-BZOJ-1626-[Usaco2007 Dec]Building Roads 修建道路
- bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路(最小生成树)
- 1626: [Usaco2007 Dec]Building Roads 修建道路 (生成树)
- [Usaco2007 Dec]Building Roads 修建道路
- [Usaco2007 Dec]Building Roads 修建道路
- BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路
- BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路
- bzoj 1626[Usaco2007 Dec]Building Roads 修建道路
- BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路 kruskal
- 最小生成树模版题Prim——修建道路
- 最小生成树 HZOI 2016公路修建
- lgP1265 公路修建 (最小生成树)
- jmap查看内存使用情况与生成heapdump
- 集合结构图
- openfire插件最佳实践(四)离线消息推送ios服务器
- iOS swift HTTPS 9813错误解决记录
- Codeforces 626F Group Projects 动态规划
- [bzoj1626][Usaco2007 Dec][最小生成树]修建道路
- java 字符流 读写
- 过滤器一般常用的功能
- RSA加密算法Java代码示例
- 微信小程序商品详情页规格属性选择
- Java虚拟机类加载机制
- rtree原理
- Spring中@Async注解实现方法的异步调用
- 数据降维方法总结