POJ2236
https://vjudge.net/problem/POJ-2236
In the process of repairing the network, workers can take two kinds of operations at every moment, repairing a computer, or testing if two computers can communicate. Your job is to answer all the testing operations.
Input
1. "O p" (1 <= p <= N), which means repairing computer p.
2. "S p q" (1 <= p, q <= N), which means testing whether computer p and q can communicate.
The input will not exceed 300000 lines.
Output
Sample Input
4 1
0 1
0 2
0 3
0 4
O 1
O 2
O 4
S 1 4
O 3
S 1 4
Sample Output
FAIL
SUCCESS
版本一 :
使用数组
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#define maxn 50010
using namespace std;
int n;
double d;
double dx[],dy[];
int pre[],repair[];
double dis(int a,int b)
{
return sqrt((dx[a]-dx[b])*(dx[a]-dx[b])+(dy[a]-dy[b])*(dy[a]-dy[b]));
}
int Find(int x)
{
if(x!=pre[x])
return pre[x]=Find(pre[x]);
}
int Union(int x,int y)
{
pre[Find(x)]=Find(y);
}
int main()
{
cin>>n>>d;
for(int i=;i<=n;i++)
{
cin>>dx[i]>>dy[i];
pre[i]=i;
}
char k;
int p,q,len=;
getchar();
while(~scanf("%c",&k))
{
if(k=='O')
{
cin>>p;
repair[len++]=p;
for(int i=;i<len-;i++)
if(dis(p,repair[i])<=d)
Union(repair[i],p);
}
else
{
cin>>p>>q;
if(Find(p)==Find(q))
cout<<"SUCCESS"<<endl;
else
cout<<"FAIL"<<endl;
}
getchar();
}
return ;
}
版本二:
使用结构体
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#define maxn 1005
using namespace std;
int n;
double d;
struct node
{
double x,y;
int pre;//根节点
int ranks;//树的高度
bool repair;//是否修复
}link[maxn];
int Find(int x)
{
if(x!=link[x].pre)
return link[x].pre=Find(link[x].pre);
}
double dis(int i,int j)
{
return sqrt((link[i].x-link[j].x)*(link[i].x-link[j].x)+(link[i].y-link[j].y)*(link[i].y-link[j].y));
}
void Union(int i,int j)
{
//if(link[i].repair&&link[j].repair)
// return 0;
int root1=Find(i),root2=Find(j);
//if(root1==root2)return 0;
if(link[root1].ranks>link[root2].ranks)
{
link[root2].pre=root1;
link[root1].ranks+=link[root2].ranks;
}
else
{
link[root1].pre=root2;
link[root2].ranks+=link[root1].ranks;
}
//return 1;
} int main()
{
cin>>n>>d;
for(int i=;i<=n;i++)
{
cin>>link[i].x>>link[i].y;
link[i].ranks=;
link[i].pre=i;
link[i].repair=;
}
char k;
int p,q;
getchar();
while(~scanf("%c",&k))
{
if(k=='O')
{
cin>>p;
link[p].repair=;
for(int i=;i<=n;i++)
{
if(Find(i)!=Find(p)&&link[i].repair&&dis(i,p)<=d)
Union(p,i);
}
}
else
{
cin>>p>>q;
if(Find(p)==Find(q))
cout<<"SUCCESS"<<endl;
else
cout<<"FAIL"<<endl;
}
getchar();
}
return ;
}
题目大意:
n个站点,已知站点的坐标。
‘O'操作 每次修通一个站点,该站点与距离该站点小于d且也为修通的站点联通;
’S'操作 查询两个站点是否联通。
思路:
并查集的题。设置距离函数,如果满足距离条件则将两个点合并。如果查询到的两点根节点相同则能联通。
POJ2236的更多相关文章
- POJ-2236(并查集)
Wireless NetWork POJ-2236 需要注意这里的树的深度需要初始化为0. 而且,find函数需要使用路径压缩,这里的unint合并函数也使用了优化(用一开始简单的合并过不了). #i ...
- 并查集 poj2236
网址:http://poj.org/problem?id=2236 题意:有n台坏的电脑,如果每两台电脑的距离不能超过d,那么这两台电脑有联系,用字符串O 表示标记第x台电脑维修了,用S判断从X到y是 ...
- poj2236(并查集)
题目链接: http://poj.org/problem?id=2236 题意: 有n台计算机, 已知每台计算机的坐标, 初始时所有计算机都是坏的, 然后修复其中一些计算机, 已修复的计算机距离不超过 ...
- poj-2236 Wireless Network &&poj-1611 The Suspects && poj-2524 Ubiquitous Religions (基础并查集)
http://poj.org/problem?id=2236 由于发生了地震,有关组织组把一圈电脑一个无线网,但是由于余震的破坏,所有的电脑都被损坏,随着电脑一个个被修好,无线网也逐步恢复工作,但是由 ...
- POJ2236 Wireless Network
解题思路:简单并查集,注意时间限制是10000MS,每次进行O操作之后, 进行一次for循环,进行相关调整.同时注意输入输出格式,见代码: #include<cstdio> #incl ...
- POJ2236 Wireless Network 并查集
水题 #include<cstdio> #include<cstring> #include<queue> #include<set> #include ...
- poj2236 基础并查集
题目链接:http://poj.org/problem?id=2236 题目大意:城市网络由n台电脑组成,因地震全部瘫痪,现在进行修复,规定距离小于等于d的电脑修复之后是可以直接相连 进行若干操作,O ...
- poj2236(并查集)
题目连接 题意:一张图上分布着n台坏了的电脑,并知道它们的坐标.两台修好的电脑如果距离<=d就可以联网,也可以通过其他修好的电脑间接相连.给出操作“O x”表示修好x,给出操作“S x y”,请 ...
- poj2236无线网络
这一题的大意:在救灾当中需要用网络,这堆人就用笔记本建了一个无线网,但是来,互相通信都是有距离限制的,一台电脑只能和距离他为d的电脑通信,然后一台电脑也可以通过几台电脑搭成线这样通信.然后就是输入每台 ...
随机推荐
- 理解es6中的const与“不变”
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动. 效果 对于简单类型的数据(数值.字符串.布尔值),值就保存在变量指向的那个内存地址,因此等同于常量. 对于复合类型 ...
- Jedis工具类代码
安装Redis可以参考 https://www.cnblogs.com/dddyyy/p/9763098.html Redis的学习可以参考https://www.cnblogs.com/dddyyy ...
- HashMap底层实现原理(JDK1.8)源码分析
ref:https://blog.csdn.net/tuke_tuke/article/details/51588156 http://www.cnblogs.com/xiaolovewei/p/79 ...
- CSS之Normalize.css的使用(重置表)
本文译自Normalize.css官网: http://nicolasgallagher.com/about-normalize-css/ Normalize.css 只是一个很小的CSS文件,但它在 ...
- 前端面试整理——javascript算法和测试题
(1)算法: 1.斐波那契数列:1.1.2.3.5.8.13.21.输入n,输出数列中第n位数的值. 方案一: function fn(n){ var num1 = 1, num2= 1, num3 ...
- canvas纯绘制雨伞、飞机、五角星、桃心,无逻辑
由于网上很多都是用很多算法和逻辑使用canvas进行绘制,但有时也无法解决一些小众需求 . 为了满足需求不能写运算纯手写,感觉真的很浪费时间,只有自己踩过的坑,才不想看到别人也被坑.我很懒,也想过弄个 ...
- Android根据图片Uri获取图片path绝对路径的几种方法【转】
在Android 编程中经常会用到Uri转化为文件路径,如我们从相册选择图片上传至服务器,一般上传前需要对图片进行压缩,这时候就要用到图片的绝对路径. 下面对我开发中uri转path路径遇到的问题进行 ...
- memcached分析
memcache介绍 memcache是一个高性能的分布式的内存对象缓存系统,用于动态Web应用以减轻数据库负担.它通过在内存中缓存数据和对象,来减少读取数据库的次数.从而提高动态.数据库驱动网站速度 ...
- 关键字提取算法TF-IDF和TextRank(python3)————实现TF-IDF并jieba中的TF-IDF对比,使用jieba中的实现TextRank
关键词: TF-IDF实现.TextRank.jieba.关键词提取数据来源: 语料数据来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据 数据处 ...
- Video.js web视频播放器
免费视频播放器videojs中文教程 Video.js是一款web视频播放器,支持html5和flash两种播放方式.更多关于video.js的介绍,可以访问官方网站介绍,我之前也写过一篇关于vide ...