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

来源:互联网 发布:歼十模型淘宝 编辑:程序博客网 时间:2024/05/22 16:52

就是求最大边最小,就是最小生成树,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[N],ans=0;bool vis[N];struct point{    int x,y;}p[N];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;}