您的位置:首页 > 其它

POJ-2236 Wireless Network

2016-07-11 10:18 197 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66964#problem/A
题目大意:给你N个点及他们的坐标以及一个距离D,若两点的欧几里得距离不大于D则可以通信。
现在N个点全部损坏,给出若干操作:一、修复一个点。二、询问两个点是否可以通信(经中转间接通信也算)。
解题思路:询问连通性的话最简单的就是并查集了,这个题最多有300000条操作,且并没有保证不重复修复同一个点,但因为有10秒,所以还是可以对每次修复O(n)查找可与其合并的点用并查起维护连通性即可。
代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=1005;
int  fa[maxn],dx[maxn],dy[maxn];
bool can_use[maxn];
int n,d;
int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
int dist(int a,int b){
int Dx=dx[a]-dx[b];
int Dy=dy[a]-dy[b];
return Dx*Dx+Dy*Dy;
}
bool ok(int a,int b){
if(a==b) return 0;
if(!can_use[a]) return 0;
if(!can_use[b]) return 0;
if(dist(a,b)>d*d) return 0;
return 1;
}
int main(){
int t,p,q;
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++)
scanf("%d%d",&dx[i],&dy[i]);
for(int i=1;i<=n;i++) fa[i]=i;
char s[5];
while(cin>>s){
if(s[0]=='O'){
scanf("%d",&t);
can_use[t]=1;
for(int i=1;i<=n;i++)
if(ok(i,t)){
int f1=find(i);
int f2=find(t);
fa[f1]=f2;
}
}
else {
scanf("%d%d",&p,&q);
int f1=find(p);
int f2=find(q);
if(f1==f2) printf("SUCCESS\n");
else printf("FAIL\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: