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
- poj 2236 Wireless Network
- poj 2236 Wireless Network
- poj 2236 Wireless Network
- POJ 2236 Wireless Network
- POJ-2236 Wireless Network
- poj 2236 Wireless Network
- POJ 2236 - Wireless Network
- poj 2236 Wireless Network
- POJ 2236 Wireless Network
- poj 2236 wireless network
- POJ--2236--Wireless Network
- POJ-2236-Wireless Network
- poj 2236 Wireless Network
- poj 2236 Wireless Network
- POJ 2236Wireless Network
- POJ 2236 Wireless Network
- POJ 2236 Wireless Network
- POJ 2236 Wireless Network
- 阿里云oss的ossfs 补充说明
- Excel数据表导入数据库的经验与教训
- 如何在Github中添加图片
- 很久没有登录CSDN博客了
- WordPress更换域名简单教程
- POJ-2236 Wireless Network
- php冒泡排序
- ROC曲线和EER
- 高通平台手机开发之Camera
- BP神经网络
- ...
- C语言概述和数据类型
- cdq分治模板啦啦啦..
- 【技术晨读】EAV or JSON