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的电脑通信,然后一台电脑也可以通过几台电脑搭成线这样通信.然后就是输入每台 ...
随机推荐
- 【Java基础】12、java中方法的参数传递机制
问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个 ...
- What are the differences between struct and class in C++?
Question: This question was already asked in the context of C#/.Net. Now I'd like to learn the diffe ...
- 设计模式之策略模式(Strategy)
策略模式将不同算法的逻辑抽象接口封装到一个类中,通过组合和多态结合的方式来进行不同算法具体的实现. 作用 策略模式是一种定义一系列算法的方法,Strategy类层次为Context定义了一系列的可重用 ...
- Linux 系统性能分析工具 sar
sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以 从多方面对系统的活动进行报告,包括:文件的读写情况.系统调用的使用 ...
- Ps—导出:sql作业配合ps导出csv文件
$dateText=Get-Date #获取当前日期时间 $dateText = $dateText.ToShortDateString() #转为短日期格式(去掉时间部分) $checkDate=( ...
- 访问WEB-INF下的jsp页面
访问web-inf下的jsp文件, 1)使用springMVC,一般都会使用springMVC的视图解析器,大概会这样配置 <!--jsp视图解析器--> <bean class ...
- 【代码笔记】Web-ionic-安装及第一个app
一,下载ionic v1.0.1版本,下载地址为:ionic-v1.0.1.zip. ionic 最新版本下载地址:http://ionicframework.com/docs/overview/#d ...
- RNN,LSTM中如何使用TimeDistributed包装层,代码示例
本文介绍了LSTM网络中的TimeDistributed包装层,代码演示了具有TimeDistributed层的LSTM网络配置方法. 演示了一对一,多对一,多对多,三种不同的预测方法如何配置. 在对 ...
- Network-Emulator Network-Emulator-Toolkit网络模拟器使用详细介绍
Network-Emulator-Toolkit网络模拟器使用详细介绍 by:授客 QQ:1033553122 原理介绍 图1 如上图,一个ADSL用户通过modem连接到网络,通过网络应用如IE,M ...
- 安卓开发_关于WebView使用链接时调用浏览器显示的问题
在我们的实际开发中,我们用到WebView就是为了在自己的APP中的某个部分来显示指定网页的效果. 但是在学习的过程中,我发现一个问题: 有的网页使用WebView控件显示出来以后,再点击网页中的某个 ...