您的位置:首页 > 其它

简单并查集Wireless Network POJ - 2236

2017-06-08 15:44 399 查看
这个题之前看的时候总是感觉不是很懂那个题目意思。现在感觉还蛮简单的。。。这里的话,学到了一点,如果用到了sqrt的话,还要判断大小相等关系的话,可以转化为平方来做。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;
const int maxn = 1009;
struct node
{
int x,y;
//double dist;
};
node a[maxn];
int dis[maxn];
int vis[maxn];
int findf(int k)
{
if(k==dis[k])
return k;
else return dis[k]=findf(dis[k]);
}
int main()
{
int n,distan;
scanf("%d %d",&n,&distan);
distan=distan*distan;
for(int i=1;i<=n;i++)
{
scanf("%d %d",&a[i].x,&a[i].y);
}
char s[5];
for(int i=0;i<=n;i++) dis[i]=i;
while(scanf("%s",s)!=EOF)
{
if(s[0]=='O')
{
int d;
scanf("%d",&d);
vis[d]=1;
for(int i=1;i<=n;i++)
{
if(vis[i]&&i!=d)
{
int root1=findf(i);
int root2=findf(d);
if(root1!=root2){
int dist=(a[i].x-a[d].x)*(a[i].x-a[d].x)+(a[i].y-a[d].y)*(a[i].y-a[d].y);
//cout<<"*"<<floor(dist)<<endl;
if(dist<=distan)
{
dis[root1]=root2;
}
}
}
}
}
else {
int x,y;
scanf("%d %d",&x,&y);
int root1=findf(x);
int root2=findf(y);
if(root1!=root2)
printf("FAIL\n");
else printf("SUCCESS\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: