标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。