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

代码

刚刚学了个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. 20155313 实验三《Java面向对象程序设计》实验报告

    一.实验内容 XP基础 XP核心实践 相关工具 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器>课程 2.完成实验.撰写实验报 ...

  2. [WC2010][BZOJ1758]重建计划-[二分+分数规划+点分治]

    Description 传送门 Solution 看到那个式子,显然想到分数规划...(不然好难呢) 然后二分答案,则每条边的权值设为g(e)-ans.最后要让路径长度在[L,U]范围内的路径权值&g ...

  3. rpmforge

    Could not retrieve mirrorlist http://mirrorlist.repoforge.org/el6/mirrors-rpmforge error was : PYCUR ...

  4. 使用T4模板报错:“正在编译转换;当前上下文中不存在名称Host”

             用T4模板生成多个文件的实体时,有一句代码是这样的 string curPath = Path.GetDirectoryName(Host.TemplateFile);       ...

  5. node升级7.0以上版本使用gulp时报错

    今天使用gulp时 ,出现了以下报错信息: Error: Cannot find module 'internal/fs'at Object.<anonymous> (/home/XXX/ ...

  6. PHP序列化serialize()和反序列化unserialize()

    所谓的序列化,就是把保存在内存中的各种对象状态或属性保存起来,在需要时可以还原出来. serialize() 可处理除了 resource 之外的任何类型返回字符串,此字符串包含了表示 value 的 ...

  7. 180725-InfluxDB-v1.6.0安装和简单使用小结

    InfluxDB安装和简单使用小结 InfluxDB是一个时序性数据库,因为工作需求,安装后使用测试下是否支持大数据下的业务场景 说明: 安装最新版本 v1.6.0 集群版本要收费,单机版本免费 内部 ...

  8. Python接口测试实战3(下)- unittest测试框架

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  9. JVM自动内存管理机制--读这篇就GO了

    之前看过JVM的相关知识,当时没有留下任何学习成果物,有些遗憾.这次重新复习了下,并通过博客来做下笔记(只能记录一部分,因为写博客真的很花时间),也给其他同行一些知识分享. Java自动内存管理机制包 ...

  10. 【MySQL 数据库】MySQL目录

    目录 [第一章]MySQL数据概述 [第二章]MySQL数据库基于Centos7.3-部署 [MySQL解惑笔记]Centos7下卸载彻底MySQL数据库 [MySQL解惑笔记]忘记MySQL数据库密 ...