Time Limit: 10000MS | Memory Limit: 65536K | |
Total Submissions: 25817 | Accepted: 10742 |
Description
Input
Output
Sample Input
4 1 0 1 0 2 0 3 0 4 O 1 O 2 O 4 S 1 4 O 3 S 1 4
Sample Output
FAIL SUCCESS
思路:有距离条件的并查集,先写一个判断函数来判断是否可以加入,之后按题意查找即可。
代码:
1 Source Code 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 #define pi acos(-1.0) 9 #define mj 10 #define inf 0x3f3f3f 11 typedef double db ; 12 typedef long long ll; 13 using namespace std; 14 const int N=1e3+5; 15 const int mod=1e9+7; 16 int f[N],dis[N],d; 17 bool has[N]; 18 pair<int ,int > po[N]; 19 vector<int> e[N]; 20 int find(int x) 21 { 22 return f[x]==x?x:f[x]=find(f[x]); 23 } 24 void unit(int x,int y) 25 { 26 int fx=find(x),fy=find(y); 27 if(fx!=fy) 28 f[fx]=fy; 29 } 30 int main() 31 { 32 int n,d; 33 scanf("%d%d",&n,&d); 34 for(int i=1;i<=n;i++){ 35 f[i]=i; 36 int x,y; 37 scanf("%d%d",&x,&y); 38 po[i].first=x; 39 po[i].second=y; 40 } 41 for(int i=1;i<n;i++){ 42 for(int j=i+1;j<=n;j++){ 43 int x1=po[i].first,y1=po[i].second,x2=po[j].first,y2=po[j].second; 44 if((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)<=d*d) {e[i].push_back(j);e[j].push_back(i);} 45 } 46 } 47 char s[2]; 48 while(scanf("%s",s)==1){ 49 if(s[0]==‘O‘){ 50 int x; 51 scanf("%d",&x); 52 has[x]=1; 53 for(int i=0;i<e[x].size();i++){ 54 int v=e[x][i]; 55 if(has[v]){ 56 unit(v,x); 57 } 58 } 59 } 60 else 61 { 62 int x,y; 63 scanf("%d%d",&x,&y); 64 // printf("%d find:%d %d find:%d\n",x,find(x),y,find(y)); 65 if(find(x)==find(y)) puts("SUCCESS"); 66 else puts("FAIL"); 67 } 68 } 69 return 0; 70 }
原文:http://www.cnblogs.com/mj-liylho/p/6504812.html