这个题之前看的时候总是感觉不是很懂那个题目意思。现在感觉还蛮简单的。。。这里的话,学到了一点,如果用到了sqrt的话,还要判断大小相等关系的话,可以转化为平方来做。
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int maxn = 1009; struct node { int x,y; //double dist; }; node a[maxn]; int dis[maxn]; int vis[maxn]; int findf(int k) { if(k==dis[k]) return k; else return dis[k]=findf(dis[k]); } int main() { int n,distan; scanf("%d %d",&n,&distan); distan=distan*distan; for(int i=1;i<=n;i++) { scanf("%d %d",&a[i].x,&a[i].y); } char s[5]; for(int i=0;i<=n;i++) dis[i]=i; while(scanf("%s",s)!=EOF) { if(s[0]=='O') { int d; scanf("%d",&d); vis[d]=1; for(int i=1;i<=n;i++) { if(vis[i]&&i!=d) { int root1=findf(i); int root2=findf(d); if(root1!=root2){ int dist=(a[i].x-a[d].x)*(a[i].x-a[d].x)+(a[i].y-a[d].y)*(a[i].y-a[d].y); //cout<<"*"<<floor(dist)<<endl; if(dist<=distan) { dis[root1]=root2; } } } } } else { int x,y; scanf("%d %d",&x,&y); int root1=findf(x); int root2=findf(y); if(root1!=root2) printf("FAIL\n"); else printf("SUCCESS\n"); } } return 0; }