In the process of repairing the network, workers can take two kinds of operations at every moment, repairing a computer, or testing if two computers can communicate. Your job is to answer all the testing operations.
1. "O p" (1 <= p <= N), which means repairing computer p.
2. "S p q" (1 <= p, q <= N), which means testing whether computer p and q can communicate.
The input will not exceed 300000 lines.
4 1 0 1 0 2 0 3 0 4 O 1 O 2 O 4 S 1 4 O 3 S 1 4Sample Output
FAIL SUCCESS
题意是前N行给出所有电脑的坐标,通过两种操作。判断两个电脑能否对话。
并查集:把能连接的都归在一个集合内。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int N,d;
struct pos
{
int x,y;
}s[1010];
int parent[1010];
bool dis(double x1,double y1,double x2,double y2)
{
double p=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return p<=d?1:0;
}
int findparent(int a){
int r=a;
while(r!=parent[r]){
r=parent[r];
}
return r;
}
void unions(int a,int b)
{
int pa,pb;
pa=findparent(a);
pb=findparent(b);
if(pa!=pb){
parent[pa]=pb;
}
return ;
}
int main()
{
memset(parent,0,sizeof(parent));
scanf("%d %d",&N,&d);
for(int i=1;i<=N;i++){
scanf("%d %d",&s[i].x,&s[i].y);
}
char p;int m;
while(scanf("%c",&p)!=EOF){
if(p=='O'){
scanf("%d",&m);
parent[m]=m;
for(int i=1;i<=N;i++){
if(parent[i]&&dis(s[i].x,s[i].y,s[m].x,s[m].y)){
unions(i,m);
}
}
}
else if(p=='S'){
int m1,m2;
scanf("%d %d",&m1,&m2);
if(findparent(m1)==findparent(m2)){
printf("SUCCESS\n");
}
else printf("FAIL\n");
}
}
return 0;
}