题目:
代码:
#include<bits/stdc++.h>
using namespace std;
int f[10005],n,m;
double a[1005][3];
double cacl(int x1,int y1,int x2,int y2){
//这里的1ll是为了防止爆int
return sqrt(1ll*(x1-x2)*(x1-x2)+1ll*(y2-y1)*(y2-y1));
}
int findset(int x){
return f[x]==x?x:f[x]=findset(f[x]);
}
void solve(){
double ex,ey;
int n,end;
scanf("%lf%lf",&ex,&ey);
scanf("%d",&n);
for(int i=1;i<=n;i++)f[i]=i;
a[0][0]=0,a[0][1]=0,a[0][2]=1;
for(int i=1;i<=n;i++){
double x,y,r;
scanf("%lf%lf%lf",&x,&y,&r);
cacl(ex,ey,x,y)<=r;
end=i;
a[i][0]=x,a[i][1]=y,a[i][2]=r;
}
for(int i=0;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(cacl(a[i][0],a[i][1],a[j][0],a[j][1])<=a[i][2]+a[j][2]){
int fx=findset(i),fy=findset(j);
f[fx]=fy;
}
}
}
printf("%d",findset(0)==findset(end)?1:0);
}
int main(){
int _;
cin>>_;
while(_--){
solve();
}
}
点与圆和圆与圆是否联通用对应的点是否在圆内和圆是否相交的数学公式来判断。
最后判一个每个圆之间是否联通所以时间复杂度为O( )