题目链接:http://poj.org/problem?id=2236
题目大意:
先根据各个电台的坐标建立修复后可以直接联系的边,然后每修好一个,就遍历与它可以直接联系的电台,若也是修好的就合并并查集。
代码实现:
#include<iostream>
#include<cmath>
using namespace std;
int par[1010],x[1010],y[1010];
int d,n,i,r,r1,k1,k2;
bool v[1010];
char ch;
//查询树的根
int find(int i)
{
if(i!=par[i])
par[i]=find(par[i]);
return par[i];
}
bool dis(int a,int b)
{
int q=x[a]-x[b];
int w=y[a]-y[b];
if(q*q+w*w<=d*d)
return true;//可以通信
else
return false;//不能通信
}
int main()
{
cin>>n>>d;
for(i=1;i<=n;i++)
{
par[i]=i;
v[i]=false;//初始化设为都是坏的
}
for(i=1;i<=n;i++)
{
scanf("%d %d",&x[i],&y[i]);//依次输入坐标
}
while(cin>>ch)
{
if(ch=='O')
{
scanf("%d",&r);//输入要修复的数字号
v[r]=true;//表示r已修复
for(i=1;i<=n;i++)
{
if(i!=r&&v[i]&&dis(i,r))
{
k1=find(r);
k2=find(i);
par[k1]=k2;
}
}
}
if(ch=='S')
{
scanf("%d %d",&r,&r1);
k1=find(r);
k2=find(r1);
if(k1==k2)
cout<<"SUCCESS"<<endl;
else
cout<<"FAIL"<<endl;
}
}
return 0;
}