Logo 铜龟的博客

博客

哪错了???

2023-07-04 08:53:49 By 铜龟
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int N,sx,sy,tx,ty;
struct node{
    int x,y,r,fa;
};
node gv[3005];
int find(int x){
    if(gv[x].fa!=x) gv[x].fa=find(gv[x].fa);
    return gv[x].fa;
}
void together(int x,int y){
    int a,b;
    a=find(x);
    b=find(y);
    gv[a].fa=b;
}
int dist(int a,int b,int c,int d){
    return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
int main(){
    cin>>N;
    cin>>sx>>sy>>tx>>ty;
    for(int i = 0;i < N;i++){
        cin>>gv[i].x>>gv[i].y>>gv[i].r;
        gv[i].fa=i;
    }
    for(int i = 0;i < N;i++){
        for(int j = 0;j < N;j++){
            if(i==j) continue;
            if(dist(gv[i].x,gv[i].y,gv[j].x,gv[j].y)<=gv[i].r+gv[j].r&&dist(gv[i].x,gv[i].y,gv[j].x,gv[j].y)>=abs(gv[i].r-gv[j].r)) together(i,j);
        }
    }
    int a,b;
    for(int i = 0;i < N;i++){
        if(dist(gv[i].x,gv[i].y,sx,sy)==gv[i].r){
            a=i;
            break;
        }
    }
    for(int i = 0;i < N;i++){
        if(dist(gv[i].x,gv[i].y,tx,ty)==gv[i].r){
            b=i;
            break;
        }
    }
    a=find(a);
    b=find(b);
    if(a==b){
        cout<<"Yes";
    }else{
        cout<<"No";
    }
    return 0;
}

atcoder.jp: abc259_d

luogu: AT_abc259_d

此题是图论(并查集)

请看看,不知为何WA。

还有,以下是一个大牛的AcCode:

#include<iostream>
#define int long long
using namespace std;

int x[3005],y[3005],r[3005],p[3005];

int find(int x){
    if(x!=p[x]) p[x]=find(p[x]);
    return p[x];
}

int dist(int x1,int y1,int x2,int y2){
   return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}

signed main(){
    int n,sx,sy,tx,ty,ts,ss;
    cin>>n;
    cin>>sx>>sy>>tx>>ty;

    for(int i=1;i<=n;i++){
        cin>>x[i]>>y[i]>>r[i];
        if(dist(sx,sy,x[i],y[i])==r[i]*r[i]) ss=i;
        if(dist(tx,ty,x[i],y[i])==r[i]*r[i]) ts=i;
    }

    for(int i=1;i<=n;i++) p[i]=i;

    for(int i=1;i<=n;i++) 
      for(int j=1;j<=n;j++) 
        if(dist(x[i],y[i],x[j],y[j])<=(r[i]+r[j])*(r[i]+r[j])&&dist(x[i],y[i],x[j],y[j])>=abs(r[i]-r[j])*abs(r[i]-r[j])) 
            p[find(i)]=find(j);

    cout<<(find(ss)==find(ts)?"Yes":"No");
}

评论

zhangtengtian
…………………… (王津博,其实是我,华浚哲。我们班一个同学把他的账号和密码都告诉我了,我就登进来了。(^-^))

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。