题意其实就是说有很多个点,求一组边把它们都连接起来,并且最大的那条边最小。很明显这就是一个最小生成树,是一颗保证最长边最短的树。

代码

刚刚学了个Borůvka算法,于是写了两个。

Borůvka

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<cmath>
#define Pow(x) ((x)*(x))
using namespace std;
int read() {
int x=0,f=1;
char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxh=505;
const int maxn=1e3+10;
const int maxm=maxn*maxn;
int jp[maxh],n,m,all,f[maxn],close[maxn];
struct node {
double x,y;
} a[maxn];
struct bian {
int u,v;
double w;
} e[maxm];
double dist(node &a,node &b) {
return sqrt(Pow(a.x-b.x)+Pow(a.y-b.y));
}
int find(int x) {
return f[x]==x?x:f[x]=find(f[x]);
}
double boruvka() {
for (int i=1;i<=n;++i) f[i]=i;
e[0].w=1e300;
double ret=0;
for (int t=n;t>1;) {
memset(close,0,sizeof close);
for (int i=1;i<=all;++i) if (find(e[i].u)!=find(e[i].v)) {
int fx=find(e[i].u),fy=find(e[i].v);
if (e[i].w<e[close[fx]].w) close[fx]=i;
if (e[i].w<e[close[fy]].w) close[fy]=i;
}
for (int i=1;i<=n;++i) if (find(i)==i && close[i]) {
int x=find(e[close[i]].u),y=find(e[close[i]].v);
if (x!=y) f[x]=y,ret=max(ret,e[close[i]].w),--t;
}
}
return ret;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
freopen("my.out","w",stdout);
#endif
m=read();
for (int i=1;i<=m;++i) jp[i]=read();
n=read(),all=0;
for (int i=1;i<=n;++i) a[i].x=read(),a[i].y=read();
for (int i=1;i<=n;++i) for (int j=i+1;j<=n;++j) e[++all]=(bian){i,j,dist(a[i],a[j])};
double mst=boruvka();
int ans=0;
for (int i=1;i<=m;++i) ans+=(jp[i]>=mst);
printf("%d\n",ans);
return 0;
}

Kruskal

#include<cstdio>
#include<cctype>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxh=505;
const int maxn=1e3+10;
const int maxm=maxn*maxn;
struct bian {
int u,v;
double w;
inline bool operator < (const bian &a) const {return w<a.w;}
} e[maxm];
struct P {
double x,y;
} a[maxn];
double jp[maxn];
int f[maxn];
int find(int x) {
return f[x]==x?f[x]:f[x]=find(f[x]);
}
double dist(P &a,P &b) {
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
freopen("std.out","w",stdout);
#endif
int n,m;
scanf("%d",&m);
for (int i=1;i<=m;++i) scanf("%lf",jp+i);
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%lf%lf",&a[i].x,&a[i].y);
int all=0;
double mst=0;
for (int i=1;i<=n;++i) for (int j=i+1;j<=n;++j) e[++all]=(bian){i,j,dist(a[i],a[j])};
sort(e+1,e+all+1);
for (int i=1;i<=n;++i) f[i]=i;
for (int i=1,j=0;i<=all && j<n;++i) {
int u=e[i].u,v=e[i].v,fx=find(u),fy=find(v);
double w=e[i].w;
if (fx!=fy) {
f[fx]=fy;
mst=max(mst,w);
++j;
}
}
int ans=0;
for (int i=1;i<=m;++i) if (jp[i]>=mst) ++ans;
printf("%d\n",ans);
return 0;
}

bzoj2429- 聪明的猴子的更多相关文章

  1. BZOJ2429[HAOI2006]聪明的猴子[最小生成树 kruskal]

    2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 896  Solved: 575[Submit][Statu ...

  2. 最小生成树 2429: [HAOI2006]聪明的猴子

    BZOJ 2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 877  Solved: 566[Submit][ ...

  3. [原]携程预选赛A题-聪明的猴子-GCD+DP

    题目: 聪明的猴子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  4. 【解题报告】[动态规划] CodingTrip - 携程编程大赛 (预赛第一场)- 聪明的猴子

    原题: 聪明的猴子 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Problem D ...

  5. 最小生成树——[HAOI2006]聪明的猴子

    题目:[HAOI2006]聪明的猴子 描述: [题目描述] 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着, 猴子不会游泳,但跳 ...

  6. BZOJ 2429: [HAOI2006]聪明的猴子( MST )

    水题, 求MST即可. -------------------------------------------------------------------------------- #includ ...

  7. 2429: [HAOI2006]聪明的猴子

    2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 448  Solved: 309[Submit][Statu ...

  8. 洛谷—— P2504 [HAOI2006]聪明的猴子

    P2504 [HAOI2006]聪明的猴子 题目描述 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上. ...

  9. 洛谷——P2504 [HAOI2006]聪明的猴子

    P2504 [HAOI2006]聪明的猴子 题目描述 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上. ...

  10. cogs 1310. [HAOI2006]聪明的猴子

    1310. [HAOI2006]聪明的猴子 ★   输入文件:monkey.in   输出文件:monkey.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 在一个热带 ...

随机推荐

  1. 在sql server 中查找一定时间段内访问数据库情况

    total_worker_time AS [总消耗CPU 时间(ms)], execution_count [运行次数], qs.total_worker_time AS [平均消耗CPU 时间(ms ...

  2. Python:静态方法、类方法、实例方法

    1. 静态方法@staticmethod (1)无需自身对象的self参数和自身类的cls参数,可直接通过 类名.方法名 进行调用 (2)Python中并不是真正意义上的静态方法,因为类定义本身就是个 ...

  3. 【MySQL函数】MySQL 5.5从零开始学第六章

    说明:本文总结自:<MySQL 5.5从零开始学>第六章 MySQL中的函数包括: 数学函数.字符串函数.日期和时间函数.条件判断函数.系统信息函数和加密函数等. 函数: 表示对输入参数值 ...

  4. javaweb总结(四十)——编写自己的JDBC框架

    一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...

  5. LDPC译码算法代码概述

    程序说明 V0.0 2015/1/24 LDPC译码算法代码概述   概述   本文介绍了包括LDPC_Simulation.m, ldpcdecoderbp1.m,ldpcdecoderminsum ...

  6. React入门基础(学习笔记)

    这篇博客是我通过阅读React官方文档的教程总结的学习笔记,翻译可能存在误差,如有疑问请参见http://reactjs.cn/react/docs/tutorial.html . 一.所需文件 在编 ...

  7. appium+python自动化☞环境搭建

    前言:appium可以说是做app最火的一个自动化框架,它的主要优势是支持android和ios,另外脚本语言也是支持java和Python.略懂Python,所以接下来的教程是 appium+pyt ...

  8. Python中abs()和math.fabs()区别

    描述:Python中fabs(x)方法返回x的绝对值.虽然类似于abs()函数,但是两个函数之间存在以下差异: abs()是一个内置函数,而fabs()在math模块中定义的. fabs()函数只适用 ...

  9. Winrar去广告图文教程

    一.前言 1.1 Winrar 解压缩工具 市场上有很多优秀的压缩工具,常用的有Winrar 和360 压缩工具.Winrar是免费压缩工具,特色是每次使用都会弹出广告.影响用户体验和工作效率,当然最 ...

  10. web _service 接口

    1.WebService 就是 http请求    post接口 2.需要加 请求头信息 Content-Type: text/xml; 3.需要把占位符换成需要的字符串 webservice接口可以 ...