POJ-2236 Wireless Network

来源:互联网 发布:男士裤子 知乎 编辑:程序博客网 时间:2024/06/09 15:28
题目链接: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;}

1 0