您的位置:首页 > 其它

poj2236 Wireless Network 简单并查集

2017-03-15 15:03 417 查看
题意:有若干台坏的电脑,每个电脑有一个坐标位置,并且在修好后可以与和其距离小于等于d的电脑联系,两台电脑间也可以通过其他电脑间接联系,输入‘O’(此为字母O,刚开始看成数字‘0’,改了好久才发现)后再输入数字即为修复该电脑,输入‘S’后再输入两个数字即为测试该两台电脑是否可以进行联系。

建立N并查集,当修复了某一台电脑后用新的结构体记录,编号设为x,并对之前修复过的电脑循环操作,某一次编号为y,若该两台电脑间距离小于等于d,则将并查集中x和y连接.

当测试编号为a,b的时候,就对并查集中a和b是否连接进行判断并进行输出。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<set>
#include<bitset>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<utility>
#define INF 1000000007
#define inf 100000000000000000
using namespace std;
typedef long long ll;
int far[1005],ran[1005],n,d,p,q,i,j,numrep=0;
char c;
void init(int n)
{
for(int i=1;i<=n;i++)
{
far[i]=i;ran[i]=0;
}
}
int findx(int k)
{
if(far[k]==k)return k;
return far[k]=findx(far[k]);
}
void unite(int x,int y)
{
x=findx(x);y=findx(y);
if(x==y)return ;
if(ran[x]<ran[y])far[x]=y;
else
{
far[y]=x;
if(ran[x]==ran[y])ran[x]++;
}
}
bool same(int x,int y)
{
return findx(x)==findx(y);
}
struct node
{
int x,y,numb;
}com[1005],rep[1005];
double dis(node a,node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)*1.0+(a.y-b.y)*(a.y-b.y)*1.0);
}
int main()
{
scanf("%d%d",&n,&d);
init(n);
for(i=0;i<n;i++)
{
scanf("%d%d",&com[i].x,&com[i].y);
com[i].numb=i;
}
while(scanf("\n%c",&c)!=EOF)
{
if(c=='O')
{
scanf("%d",&p);
for(i=0;i<numrep;i++)
{
if(dis(rep[i],com[p-1])<=d)
{
unite(rep[i].numb,p-1);
}
}
rep[numrep++]=com[p-1];
}
else if(c=='S')
{
scanf("%d%d",&p,&q);
if(same(p-1,q-1))printf("SUCCESS\n");
else printf("FAIL\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: