#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");
}