poj-2236 Wireless Network &&poj-1611 The Suspects && poj-2524 Ubiquitous Religions (基础并查集)
http://poj.org/problem?id=2236
由于发生了地震,有关组织组把一圈电脑一个无线网,但是由于余震的破坏,所有的电脑都被损坏,随着电脑一个个被修好,无线网也逐步恢复工作,但是由于硬件的限制,一台电脑和另一台电脑能够相连当他们之间的距离小于d,或者还有一台电脑当中介,分别与两台电脑相连。
在修复的过程中,工作者会有两种操作,修复电脑和询问电脑a和电脑b是否相连。当询问的时候输出答案。
因为输入数据很大,需要快速判断电脑a和电脑b相连,所以自然想到用并查集。
初始时候 全部电脑都是损坏的,那么每修复一次,就需要把与当前电脑距离小于d并且已经修复的电脑连接起来,询问的时候直接判断即可。
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn = ;
struct node
{
int x,y;
}p[maxn];
int par[maxn],flag[maxn]; //作为是否修复的标记
int n;
double dis[maxn][maxn]; //存储两点之间的距离
double d;
void init()
{
for(int i=;i<=n;i++) par[i]=i;
} int find(int x)
{
return x==par[x]?x:par[x]=find(par[x]);
} void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
par[x]=y;
} void distance(int a,int b)
{
dis[a][b]=dis[b][a]=sqrt(1.0*(p[a].x-p[b].x)*(p[a].x-p[b].x)+1.0*(p[a].y-p[b].y)*(p[a].y-p[b].y));
} void solve(int x)
{
for(int i=;i<=n;i++)
{
if(i!=x&&flag[i]&&dis[x][i]<=d)
unite(x,i);
}
} int main()
{
//freopen("a.txt","r",stdin);
scanf("%d%lf",&n,&d);
init();
memset(flag,,sizeof(flag));
memset(dis,,sizeof(dis));
for(int i=;i<=n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
for(int i=;i<=n;i++) //预处理所有两点之间的距离
for(int j=i+;j<=n;j++)
distance(i,j);
char s[];
int a,b;
while(~scanf("%s",s))
{
if(s[]=='O')
{
scanf("%d",&a);
flag[a]=;
solve(a);
}
else if(s[]=='S')
{
scanf("%d%d",&a,&b);
if(find(a)==find(b)) printf("SUCCESS\n");
else printf("FAIL\n");
}
}
return ;
}
http://poj.org/problem?id=1611
在大学里有n个学生(0-n-1)和m个社团,每个学生可以加多个社团,但是因为SARS的流行,学校需要统计出有多少病毒携带者,如果一个社团有一个携带者,那么整个社团都是 病毒携带者,现在已知0号学生是携带者,给出m个社团的信息,求出有多少人感染。
基础的并查集,只要增加一个rank[]用来统计每一个组的人数,这样在unite的时候累加合并过来的人数,最后输出0号所在的组的人数。
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = ;
int par[maxn],rank[maxn]; void init(int n)
{
for(int i=;i<n;i++)
{
par[i]=i;
rank[i]=;
}
} int find(int x)
{
return x==par[x]?x:par[x]=find(par[x]);
} void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
{
par[x]=y;
rank[y]+=rank[x];
}
} int main()
{
int n,m,k,a,b;
while(~scanf("%d%d",&n,&m))
{
if(n==&&m==) break;
init(n);
for(int i=;i<m;i++)
{
scanf("%d",&k);
for(int j=;j<k;j++)
{
scanf("%d",&a);
if(j==)
{
b=a;
}
else unite(a,b);
}
}
printf("%d\n",rank[find()]);
}
return ;
}
http://poj.org/problem?id=2524
n个学生,每个学生都只有一种信仰,给出m条关系,统计最多有多少种信仰。
简单并查集,读入关系后合并即可。
#include <cstdio>
const int maxn = ;
int n,count,par[maxn]; void init(int n)
{
for(int i=;i<=n;i++)
{
par[i]=i;
}
} int find(int x)
{
return x==par[x]?x:par[x]=find(par[x]);
} void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
{
par[x]=y;
count--;
}
} int main()
{
int m,a,b,j=;
while(~scanf("%d%d",&n,&m))
{
if(n==&&m==) break;
count=n;
init(n);
for(int i=;i<m;i++)
{
scanf("%d%d",&a,&b);
unite(a,b);
}
printf("Case %d: %d\n",j++,count);
}
return ;
}
poj-2236 Wireless Network &&poj-1611 The Suspects && poj-2524 Ubiquitous Religions (基础并查集)的更多相关文章
- poj 2524:Ubiquitous Religions(并查集,入门题)
Ubiquitous Religions Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 23997 Accepted: ...
- POJ 2524 Ubiquitous Religions (并查集)
Description 当今世界有很多不同的宗教,很难通晓他们.你有兴趣找出在你的大学里有多少种不同的宗教信仰.你知道在你的大学里有n个学生(0 < n <= 50000).你无法询问每个 ...
- poj 2524 Ubiquitous Religions(并查集)
Ubiquitous Religions Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 23168 Accepted: ...
- POJ 2524 Ubiquitous Religions 【并查集】
解题思路:输入总人数 n,和m组数据:即和杭电畅通工程相类似,对这m组数据做合并操作后,求最后一共有多少块区域. #include<stdio.h> int pre[50001]; int ...
- poj 2524 Ubiquitous Religions(简单并查集)
对与知道并查集的人来说这题太水了,裸的并查集,如果你要给别人讲述并查集可以使用这个题当做例题,代码中我使用了路径压缩,还是有一定优化作用的. #include <stdio.h> #inc ...
- POJ 2236 Wireless Network ||POJ 1703 Find them, Catch them 并查集
POJ 2236 Wireless Network http://poj.org/problem?id=2236 题目大意: 给你N台损坏的电脑坐标,这些电脑只能与不超过距离d的电脑通信,但如果x和y ...
- [ An Ac a Day ^_^ ] [kuangbin带你飞]专题五 并查集 POJ 2236 Wireless Network
题意: 一次地震震坏了所有网点 现在开始修复它们 有N个点 距离为d的网点可以进行通信 O p 代表p点已经修复 S p q 代表询问p q之间是否能够通信 思路: 基础并查集 每次修复一个点重新 ...
- [并查集] POJ 2236 Wireless Network
Wireless Network Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 25022 Accepted: 103 ...
- poj 2236:Wireless Network(并查集,提高题)
Wireless Network Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 16065 Accepted: 677 ...
随机推荐
- Build Simple HTTP server
1. The server just support POST&PUT method 2. It is a Python server, and save upload files in sp ...
- RMQ(st)
int dp[1111][12]; int a[1111]; int n; void RMQ_init() { for(int i=1;i<=n;i++) { d ...
- c#中的线程一
一.使用线程的理由 1.可以使用线程将代码同其他代码隔离,提高应用程序的可靠性. 2.可以使用线程来简化编码. 3.可以使用线程来实现并发执行 二.基本知识 1.进程与线程:进程作为操作系统执行程序的 ...
- 一套名企WEB前端面试题,不提供答案
1.说说你对Doctype的理解 2.web产品开发的流程 3.说说你对盒子模型的理解 4.前端页面有哪三层构成,分别是什么?作用是什么? 5.行内元素有哪些?块级元素有哪些?他们如何相互转化? 6. ...
- windbg内核诊断方式--转载
一.WinDbg是什么?它能做什么? WinDbg是在windows平台下,强大的用户态和内核态调试工具.它能够通过dmp文件轻松的定位到问题根源,可用于分析蓝屏.程序崩溃(IE崩溃)原因,是我们日常 ...
- iOS富文本-NSAttributedString简单封装
直接调用系统的写起来比较麻烦,封装一下 因为要简单所以就写类方法 WJAttributeStyle 基类 ) { ; i < styles.count; i ++) { ...
- Android的事件处理机制详解(二)-----基于监听的事件处理机制
基于监听的事件处理机制 前言: 我们开发的app更多的时候是需要与用户的交互----即对用户的操作进行响应 这就涉及到了android的事件处理机制; android给我们提供了两套功能强大的处理机制 ...
- Xcode 创建静态库和动态库
1.linux中静态库和动态库区别: 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库:这类库的名字一般是libxxx.a:利用静态函数库编译成的文件 ...
- JS异步加载的三种方式
js加载的缺点:加载工具方法没必要阻塞文档,过得js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作. 有些工具方法需要按需加载,用到再加载,不用不加载,. 默认正常 ...
- 【bzoj2434-阿狸的打字机】AC自动机+fail树+优化
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23083 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一 ...