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)查找可与其合并的点用并查起维护连通性即可。
代码:
题目大意:给你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; }
相关文章推荐
- Excel数据表导入数据库的经验与教训
- 微软源代码管理工具TFS2013安装与使用详细图文教程(Vs2013)
- linux 系统下删除缓存/清理孤立包
- 安卓手册 第六章(开发之EditText)
- 很久没有登录CSDN博客了
- 阿里云oss的ossfs 补充说明
- seo 搜索引擎优化
- Android Studio 快捷键
- Thread_wait、notify、notifyAll的使用方法
- Cursor query
- oracle 12c:新特性-对Top-N查询结果限制记录
- Tkinter教程之Scale篇
- 浅谈Java设计模式(十四)模板方法模式(Template Method)
- oxyplot 禁止拖动,缩放
- 我理解的webservice是这样的
- IOS人脸识别和二维码识别
- java操作MongoDB数据库
- 冒泡排序的实现
- group by查询语句中显示count(*)为0的结果
- Android Studio 单独编译一个 Module