ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BZOJ2429: [HAOI2006]聪明的猴子

2020-01-22 15:02:01  阅读:219  来源: 互联网

标签:cnt ma int head 猴子 pos HAOI2006 next BZOJ2429


思路:求出最小生成树上的最长边即可

注意:1.kruscal建边可以只连有向边 prim得连双向边 因为不知道谁先被更新

           2.求距离的平方 不算出实际距离 因为猴子的跳跃距离均为整数 反而保留了精度 

#include<iostream>
#include<cmath>
#include<cstring>//memset
using namespace std;
const int N=1000+5;
struct E{
    int to,next,w;
}e[N*N];
struct P{
    int x,y;
}p[N];
int cnt,bounce[505],head[N],d[N],vis[N],ma,n;
int dist(int i,int j){//不用开根号算出实际距离 反而保留了精度 
    return ((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y)); 
}
void add(int u,int v){
    e[++cnt].to=v;
    e[cnt].next=head[u];
    e[cnt].w=dist(u,v);
    head[u]=cnt;
    e[++cnt].to=u;
    e[cnt].next=head[v];
    e[cnt].w=dist(u,v);
    head[v]=cnt;
}
void prim(int x){
    memset(d,0x3f,sizeof(d)); 
    d[x]=0;
    int min=1e9,pos;
    for(int i=1;i<=n;i++){
        min=1e9;
        for(int j=1;j<=n;j++)
         if(!vis[j]&&min>d[j]) min=d[j],pos=j;
        vis[pos]=1;
        ma=max(ma,min);
        for(int j=head[pos];j;j=e[j].next)
          if(!vis[e[j].to]&&d[e[j].to]>e[j].w) d[e[j].to]=e[j].w;
    }
}
int main(){
   int m,ans=0;
   cin>>m;
   for(int i=1;i<=m;i++)cin>>bounce[i];
   cin>>n;
   for(int i=1;i<=n;i++)cin>>p[i].x>>p[i].y;
   for(int i=1;i<=n;i++)
    for(int j=i+1;j<=n;j++) add(i,j);
   prim(1);
   for(int i=1;i<=m;i++)
     if(bounce[i]*bounce[i]>=ma)ans++;
     cout<<ans;



  return 0;
}

标签:cnt,ma,int,head,猴子,pos,HAOI2006,next,BZOJ2429
来源: https://www.cnblogs.com/wyh447154317/p/12228612.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有