您的位置:首页 > 其它

bzoj2429 [HAOI2006]聪明的猴子(prim)

2017-09-28 08:34 288 查看
就是求最大边最小,就是最小生成树,prim应该更快些

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 1010
#define M 510
#define pa pair<int,int>
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int m,n,a[M],d
,ans=0;
bool vis
;
struct point{
int x,y;
}p
;
void prim(){
priority_queue<pa,vector<pa>,greater<pa> >q;memset(d,0x3f,sizeof(d));
d[1]=0;q.push(make_pair(0,1));
while(!q.empty()){
int x=q.top().second;q.pop();if(vis[x]) continue;
vis[x]=1;ans=max(ans,d[x]);
for(int i=1;i<=n;++i){
if(vis[i]) continue;
int dy=(p[i].x-p[x].x)*(p[i].x-p[x].x)+(p[i].y-p[x].y)*(p[i].y-p[x].y);
if(dy<d[i]){d[i]=dy;q.push(make_pair(d[i],i));}
}
}
}
int main(){
//  freopen("a.in","r",stdin);
m=read();for(int i=1;i<=m;++i) a[i]=read();
n=read();
for(int i=1;i<=n;++i) p[i].x=read(),p[i].y=read();
prim();int res=0;
for(int i=1;i<=m;++i)
if(a[i]*a[i]>=ans) res++;
printf("%d\n",res);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: