bzoj2429- 聪明的猴子
题意其实就是说有很多个点,求一组边把它们都连接起来,并且最大的那条边最小。很明显这就是一个最小生成树,是一颗保证最长边最短的树。
代码
刚刚学了个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- 聪明的猴子的更多相关文章
- BZOJ2429[HAOI2006]聪明的猴子[最小生成树 kruskal]
2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 896 Solved: 575[Submit][Statu ...
- 最小生成树 2429: [HAOI2006]聪明的猴子
BZOJ 2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 877 Solved: 566[Submit][ ...
- [原]携程预选赛A题-聪明的猴子-GCD+DP
题目: 聪明的猴子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- 【解题报告】[动态规划] CodingTrip - 携程编程大赛 (预赛第一场)- 聪明的猴子
原题: 聪明的猴子 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Problem D ...
- 最小生成树——[HAOI2006]聪明的猴子
题目:[HAOI2006]聪明的猴子 描述: [题目描述] 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着, 猴子不会游泳,但跳 ...
- BZOJ 2429: [HAOI2006]聪明的猴子( MST )
水题, 求MST即可. -------------------------------------------------------------------------------- #includ ...
- 2429: [HAOI2006]聪明的猴子
2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 448 Solved: 309[Submit][Statu ...
- 洛谷—— P2504 [HAOI2006]聪明的猴子
P2504 [HAOI2006]聪明的猴子 题目描述 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上. ...
- 洛谷——P2504 [HAOI2006]聪明的猴子
P2504 [HAOI2006]聪明的猴子 题目描述 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上. ...
- cogs 1310. [HAOI2006]聪明的猴子
1310. [HAOI2006]聪明的猴子 ★ 输入文件:monkey.in 输出文件:monkey.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 在一个热带 ...
随机推荐
- 20155327 信息安全技术 实验二 Windows口令破解
课程:信息安全概论 班级:1553 姓名:了李百乾 学号:20155327 成绩: 指导教师: 李冬冬 实验日期及时间: 2017年10月11日 15:30-18:00 必修/选修:必修 实验序号:0 ...
- 20155338 2016-2017-2《Java程序设计》实验四Android程序开发实验报告
2016-2017-2 20155338 <Java程序设计>实验四Android程序开发实验报告 实验过程及成果展示 1.修改res目录下的layout文件夹中的activity_mai ...
- 考研编程练习---StringMatching(后缀表达式)
题目描述: Finding all occurrences of a pattern in a text is a problem that arises frequently in text-edi ...
- sql语句-2-字符串数字日期时间
- PostgreSQL的pg_stats学习
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL统计信息索引页 回到顶级页面:PostgreSQL索引页 对于pg_stas,说明文档在这里: http://w ...
- centos7安装cacti
参考博客地址:https://blog.csdn.net/kenn_lee/article/details/80565385 Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络 ...
- 【转载】C/C++杂记:NULL与0的区别、nullptr的来历
原文:C/C++杂记:NULL与0的区别.nullptr的来历 某些时候,我们需要将指针赋值为空指针,以防止野指针. 有人喜欢使用NULL作为空指针常量使用,例如:int* p = NULL;. ...
- 【转载】D3DXVec3TransformNormal and D3DXVec3TransformCoord
原文:D3DXVec3TransformNormal and D3DXVec3TransformCoord D3DXVec3TransformCoord 对向量进行变换,没啥好说明的,默认向量为行向量 ...
- 如何下载YouTube 60fps视频
YouTube上面不仅支持分辨率为4K和8K的视频,同时也开启了对60fps视频的支持.60帧的视频广泛用于游戏和体育视频中,使视频看起来更加流畅和细腻.对游戏玩家来说,YouTube对60fps支持 ...
- Mysql基础操作语句
SQL 简单的增删改查 不区分大小写, 表名和字段名可不加引号 查询语句 SELECT * FROM `table_name`; -- 注释 CTRL+/ : 注释 CTRL+/ : 取消注释 /* ...