博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2236 基础并查集
阅读量:5079 次
发布时间:2019-06-12

本文共 1437 字,大约阅读时间需要 4 分钟。

题目链接:http://poj.org/problem?id=2236

题目大意:城市网络由n台电脑组成,因地震全部瘫痪,现在进行修复,规定距离小于等于d的电脑修复之后是可以直接相连

进行若干操作,O a,修复编号为a的电脑,S a,b  询问a,b电脑能否联系

思路分析:并查集,只是和并条件变了,首先要已经被修复(vis数组)其次距离要小于d,并查集搞完之后

询问的时候只需要看他们是不是有着相同的根节点即可。

代码:

#include 
#include
#include
#include
#include
using namespace std;const int maxn=1000+10;struct node{ double x; double y;};node com[maxn];int fa[maxn];bool vis[maxn];int n,d;double dis(int i,int j){ return sqrt((com[i].x-com[j].x)*(com[i].x-com[j].x)+(com[i].y-com[j].y)*(com[i].y-com[j].y));}int root(int x){ return (x==fa[x])?x:fa[x]=root(fa[x]);}void merge(int x,int y){ int fx=root(x); int fy=root(y); if(fx==fy) return; fa[fx]=fy;}int main(){ char s[10]; int a,b; memset(vis,false,sizeof(vis)); scanf("%d%d",&n,&d); for(int i=1;i<=n;i++) { scanf("%lf%lf",&com[i].x,&com[i].y); fa[i]=i; } while(scanf("%s",s)!=EOF) { if(s[0]=='O') { scanf("%d",&a); vis[a]=true; for(int i=1;i<=n;i++) { if(dis(a,i)<=d&&vis[i]) merge(i,a); } } if(s[0]=='S') { scanf("%d%d",&a,&b); if(root(a)==root(b)) printf("SUCCESS\n"); else printf("FAIL\n"); } }}

 

转载于:https://www.cnblogs.com/xuejianye/p/5701245.html

你可能感兴趣的文章
深入理解JVM读书笔记--字节码执行引擎
查看>>
vue-搜索功能-实时监听搜索框的输入,N毫秒请求一次数据
查看>>
批处理 windows 服务的安装与卸载
查看>>
React文档翻译 (快速入门)
查看>>
nodejs fs路径
查看>>
动态规划算法之最大子段和
查看>>
linux c:关联变量的双for循环
查看>>
深入浅出理解zend framework(三)
查看>>
python语句----->if语句,while语句,for循环
查看>>
javascript之数组操作
查看>>
LinkedList源码分析
查看>>
TF-IDF原理
查看>>
用JS制作博客页面背景随滚动渐变的效果
查看>>
JavaScript的迭代函数与迭代函数的实现
查看>>
一步步教你学会browserify
查看>>
Jmeter入门实例
查看>>
亲近用户—回归本质
查看>>
中文脏话识别的解决方案
查看>>
CSS之不常用但重要的样式总结
查看>>
Python编译错误总结
查看>>