标签:
Description
Input
Output
Sample Input
4 1 0 1 0 2 0 3 0 4 O 1 O 2 O 4 S 1 4 O 3 S 1 4
Sample Output
FAIL SUCCESS
告诉几个点的坐标,O操作将电脑修复,S操作查询a,b两台电脑是否连通工作
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 222222
using namespace std;
struct Node
{
int x,y;
int ff;
}f[N];
int n,d;
int fa[N];
int findfa(int x)
{
if(x==fa[x])
return fa[x];
return fa[x]=findfa(fa[x]);
}
double fun(int a,int b)
{
double ans;
ans=(f[a].x-f[b].x)*(f[a].x-f[b].x)+(f[a].y-f[b].y)*(f[a].y-f[b].y);
return ans;
}
void uniontwo(int a,int b)
{
int x=findfa(a);
int y=findfa(b);
if(x!=y)
{
if(x>y)
fa[x]=y;
else fa[y]=x;
}
}
int main()
{
while(~scanf("%d %d",&n,&d))
{
for(int i=1;i<=n;i++)
scanf("%d %d",&f[i].x,&f[i].y);
char ch[10];
for(int i=0;i<=n;i++)
{
fa[i]=i;
f[i].ff=0;
}
while(~scanf("%s",ch))
{
if(ch[0]=='O')
{
int a;
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
f[a].ff=1;
if((f[i].ff && fun(i,a)<=d*d*1.0))
{
uniontwo(i,a);
}
}
}
else
{
int a,b;
scanf("%d %d",&a,&b);
if(findfa(a)==findfa(b))
cout<<"SUCCESS"<<endl;
else
cout<<"FAIL"<<endl;
}
}
}
return 0;
}
POJ 2236Wireless Network (并查集)
标签:
原文地址:http://blog.csdn.net/wust_zjx/article/details/45201651