poj 2236 Wireless Network

// 题意:有n台损坏的电脑,在两种情况下已修复电脑能相互通信,
// 一是他们之间的距离小于d,二是他们可以借助都可到达的第三台已修复的电脑。
// 给出所有电脑的坐标位置,两种操作: O x 表示修复第x台, S x y 表示判断x y之间能否通信

#include <iostream> //并查集
using namespace std;
#define maxn 1002
int p[maxn];
int g[maxn][maxn],pos[maxn][2],work[maxn],n,d;
int near(int i,int j) //判断节点i与j是否连通
{
int dx=pos[i][0]-pos[j][0],dy=pos[i][1]-pos[j][1];
return dx*dx + dy*dy <= d*d ;
}
void init()
{
scanf("%d%d",&n,&d);
int i,j;
for(i=1;i<=n;++i)
{
p[i]=i;
}
for(i=1;i<=n;++i)
scanf("%d%d",&pos[i][0],&pos[i][1]);
for(i=1;i<=n;++i)
for(j=i+1;j<=n;++j)
{
if(g[i][j]==0&&near(i,j))
{
g[i][j]=g[j][i]=1; //表示连通
}
}
}

int find(int x)
{
return p[x]==x ? x : p[x]=find(p[x]);
}
void Union(int a,int b)
{
int x=find(a),y=find(b);
if(x!=y)
p[x]=y;
}

int main()
{
init();
char ch[2];
while(scanf("%s",ch)!=EOF)
{
int a,b;
if(ch[0]=='O')
{
scanf("%d",&a);
work[a]=1;
for(int i=1;i<=n;++i)
{
if(work[i]&&g[i][a])
{
Union(i,a);
}
}
}
else
{
scanf("%d%d",&a,&b);
if(find(a)==find(b))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}
return 0;
}

posted on 2011-07-22 14:57  sysu_mjc  阅读(106)  评论(0编辑  收藏  举报

导航