题意: 给你N台电脑,开始都是坏的,然后你有两种操作,
1: 修一台电脑。 此电脑可被联通。
2: 查询两台电脑能否联通。
两台电脑可以不是直接联通,可以是通过别的电脑链接。 还有给你两台电脑之间最大连接距离为d
(太难了!对于我这种英语渣渣,不看翻译简直天书。 典型的题意比题难!! 我翻译了两小时,也没翻译出来,原来输入的xi,yi,是电脑的坐标!!!! 还有输出结尾是!=eof。。死得很彻底!)
思路:
知道题意了,那就没什么难度了,用个并查集,修一次,跑一边,把新修的合并进去。
查询这直接找这两台电脑是一个集合不是就OK 了。
PS: poj 数据水,听说搜索都能过。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
using namespace std;
const int maxn=1111;
int n,d,a1,b1;
char c;
struct node{
int x,y;
}a[maxn];
int fa[maxn];
int v[maxn];
int Find(int x){
if(x==fa[x]) return fa[x];
else return fa[x]=Find(fa[x]);
}
void Union(int x,int y){
int x1=Find(x),y1=Find(y);
if(x1!=y1)
fa[x1]=y1;
}
int judge(int x,int y){
if(abs(a[x].x-a[y].x)*abs(a[x].x-a[y].x)+abs(a[x].y-a[y].y)*abs(a[x].y-a[y].y)>d*d) return 0;
return 1;
}
int main(){
scanf("%d %d",&n,&d);
for(int i=1;i<=n;++i){
scanf("%d %d",&a[i].x,&a[i].y);
fa[i]=i;
}getchar();
while(~scanf("%c",&c)){
if(c=='O'){
scanf("%d",&a1);v[a1]=1;
for(int i=1;i<=n;++i){
if(v[i]&&judge(i,a1)) Union(i,a1);
}
}else{
scanf("%d %d",&a1,&b1);
if(v[a1]&&v[b1]&&Find(a1)==Find(b1))
printf("SUCCESS\n");
else printf("FAIL\n");
}
getchar();
}
return 0;
}