题目大意:
给你N台电脑,从1-N。一个数字,表示两台计算机的最大通信距离,超过这个距离就无法进行通信。然后分别告诉这些电脑的坐标,接下来有两种操作,第一种O表示这点电脑修好,第二种S,表示测试这两台电脑能不能进行正常的通信
修电脑就是把这点加入到图中,S 就是判断这两个结点在不在同一个集合里,也就是是否连通
Sample Input
4 1 //n d
0 1 // x y
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 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # include <queue> 7 # define LL long long 8 using namespace std ; 9 10 const int MAXN=1010; 11 int F[MAXN] ; 12 int x[MAXN] ; 13 int y[MAXN] ; 14 int v[MAXN] ; 15 int n , d ; 16 int find(int x) //找x的祖先结点 17 { 18 while(x!=F[x]) 19 x=F[x]; 20 return x; 21 } 22 void bing(int u,int v) 23 { 24 int t1=find(u); 25 int t2=find(v); 26 if(t1!=t2) //这两个点不在一个集合里 27 F[t1]=t2; //合到一个集合里 28 } 29 30 bool dist(int a , int b) 31 { 32 int t1 = x[a] - x[b] ; 33 int t2 = y[a] - y[b] ; 34 if(t1*t1 + t2*t2 <= d*d) 35 return 1 ; 36 else 37 return 0 ; 38 } 39 40 int main() 41 { 42 //freopen("in.txt","r",stdin) ; 43 cin>>n>>d ; 44 int i ; 45 for (i = 1 ; i<= n ; i++) 46 cin>>x[i]>>y[i] ; 47 for (i = 1 ; i<= n ; i++) 48 { 49 F[i] = i ; 50 v[i] = 0 ; 51 } 52 char c ; 53 int t ; 54 while(cin>>c) 55 { 56 if (c == ‘O‘) 57 { 58 cin>>t ; 59 v[t] = 1 ; 60 for (i = 1 ; i<= n ; i++) 61 { 62 if (i != t && v[i] && dist(i,t)) 63 bing(i,t) ; 64 } 65 } 66 if (c == ‘S‘) 67 { 68 int u , v ; 69 cin>>u>>v ; 70 int t1=find(u); 71 int t2=find(v); 72 if(t1!=t2) //不连通 73 cout << "FAIL" << endl; 74 else 75 cout << "SUCCESS" << endl; 76 } 77 } 78 79 80 return 0; 81 }
时间: 2024-10-05 05:07:40