题目大意:
给你N台电脑,从1-N。一个数字,表示两台计算机的最大通信距离,超过这个距离就无法进行通信。然后分别告诉这些电脑的坐标,接下来有两种操作,第一种O表示这点电脑修好,第二种S,表示测试这两台电脑能不能进行正常的通信
解题思路:
并查集的简单应用,对每次修好的电脑对其它已经修好的电脑遍历,如果距离小于等于最大通信距离就将他们合并。之后判断2台电脑是不是一个集合中就KO了
1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<math.h> 7 #include<algorithm> 8 #include<queue> 9 #include<set> 10 #include<bitset> 11 #include<map> 12 #include<vector> 13 #include<stdlib.h> 14 #include <stack> 15 using namespace std; 16 #define PI acos(-1.0) 17 #define max(a,b) (a) > (b) ? (a) : (b) 18 #define min(a,b) (a) < (b) ? (a) : (b) 19 #define ll long long 20 #define eps 1e-10 21 #define MOD 1000000007 22 #define N 1006 23 #define inf 1e12 24 int n,d; 25 int vis[N]; 26 int fa[N]; 27 struct Node{ 28 int x,y; 29 }node[N]; 30 void init(){ 31 for(int i=0;i<N;i++){ 32 fa[i]=i; 33 } 34 } 35 int find(int x){ 36 return x==fa[x]?x:fa[x]=find(fa[x]); 37 } 38 void merge(int x,int y){ 39 int root1=find(x); 40 int root2=find(y); 41 if(root1==root2) return; 42 if((node[x].x-node[y].x)*(node[x].x-node[y].x)+(node[x].y-node[y].y)*(node[x].y-node[y].y)<=d*d){ 43 fa[root1]=root2; 44 } 45 } 46 int main() 47 { 48 scanf("%d%d",&n,&d); 49 init(); 50 memset(vis,0,sizeof(vis)); 51 for(int i=1;i<=n;i++){ 52 scanf("%d%d",&node[i].x,&node[i].y); 53 } 54 char s[3]; 55 int p,q; 56 while(scanf("%s",s)!=EOF){ 57 if(s[0]=='O'){ 58 scanf("%d",&p); 59 vis[p]=1; 60 for(int i=1;i<=n;i++){ 61 if(vis[i] && i!=p){ 62 merge(i,p); 63 } 64 } 65 }else{ 66 scanf("%d%d",&p,&q); 67 if(find(p)==find(q)){ 68 printf("SUCCESS "); 69 }else{ 70 printf("FAIL "); 71 } 72 } 73 } 74 75 return 0; 76 }