poj 1703 Find them, Catch them(种类并查集和一种巧妙的方法)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 36176 | Accepted: 11090 |
Description
two criminals; do they belong to a same clan? You must give your judgment based on incomplete information. (Since the gangsters are always acting secretly.)
Assume N (N <= 10^5) criminals are currently in Tadu City, numbered from 1 to N. And of course, at least one of them belongs to Gang Dragon, and the same for Gang Snake. You will be given M (M <= 10^5) messages in sequence, which are in the following two kinds:
1. D [a] [b]
where [a] and [b] are the numbers of two criminals, and they belong to different gangs.
2. A [a] [b]
where [a] and [b] are the numbers of two criminals. This requires you to decide whether a and b belong to a same gang.
Input
Output
Sample Input
1
5 5
A 1 2
D 1 2
A 1 2
D 2 4
A 1 4
Sample Output
Not sure yet.
In different gangs. In the same gang. 题意:是一个城市有两个帮派,A 1 2是询问1和2这两个人是不是一个帮派,D 1 2是这两个人不在一个帮派
每一次A就输出一次
思路: 带权并查集,加一个数组re[]表示子节点和其父节点的关系,是一个门派就是0。不是就是1
2015,7,27#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define M 100100
int x[M],re[M];
void init()
{
for(int i=0;i<M;i++){
x[i]=i;
re[i]=0;
}
}
int find(int k)
{
int temp=x[k];
if(x[k]==k) return k;
x[k]=find(x[k]);
if(re[k]==re[temp])//假设和父节点是同类就存0
re[k]=0;
else re[k]=1;
return x[k];
}
void merge(int a,int b,int fa,int fb)
{
x[fa]=fb;
if(re[a]==re[b]) re[fa]=1;
else re[fb]=0;
}
int main()
{
int t,n,m,i,a,b,fa,fb;
char ch;
scanf("%d",&t);
while(t--){
init();
scanf("%d%d",&n,&m);
while(m--){
cin>>ch;
scanf("%d%d",&a,&b);
fa=find(a);
fb=find(b);
if(ch=='A'){
if(fa!=fb){
printf("Not sure yet.\n");
continue;
}
if(re[a]==re[b]){
printf("In the same gang.\n");
continue;
}
else{
printf("In different gangs.\n");
}
}
else{
if(fa!=fb)
merge(a,b,fa,fb);
}
}
}
return 0;
}
/* 还有一种巧妙方法:大神的解析。是poj食物链那道题的弱化。 可见全部元素个数为2 * N,假设i表示属于帮派A。那么i + N表示属于帮派B。
每次输入两个家伙不在同一帮派的时候。就合并他们分属两个帮派的元素。 */
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define M 200200
int x[M];
void init()
{
for(int i=0;i<M;i++)
x[i]=i;
}
int find(int k)
{
if(x[k]==k) return k;
x[k]=find(x[k]);//压缩路径
return x[k];
}
void merge(int a,int b)
{
int fa=find(a);
int fb=find(b);
if(x[a]!=x[b]) x[fa]=fb;
}
bool same(int a,int b)
{
return find(a)==find(b);
}
int main()
{
int t,n,m,i,a,b,fa,fb;
char ch;
scanf("%d",&t);
while(t--){
init();
scanf("%d%d",&n,&m);
while(m--){
cin>>ch;
scanf("%d%d",&a,&b);
if(ch=='A'){
if(same(a,b)){
printf("In the same gang.\n");
continue;
}
if(same(a,b+n)){
printf("In different gangs.\n");
}
else{
printf("Not sure yet.\n");
continue;
}
}
else{
merge(a,b+n);//a和b一定不在一个门派,就把a和b+n合并
merge(a+n,b);//同理
}
}
}
return 0;
}
poj 1703 Find them, Catch them(种类并查集和一种巧妙的方法)的更多相关文章
- POJ 1703 Find them,Catch them ----种类并查集(经典)
http://blog.csdn.net/freezhanacmore/article/details/8774033?reload 这篇讲解非常好,我也是受这篇文章的启发才做出来的. 代码: #i ...
- POJ 1703 Find them, Catch them(种类并查集)
题目链接 这种类型的题目以前见过,今天第一次写,具体过程,还要慢慢理解. #include <cstring> #include <cstdio> #include <s ...
- poj 1703 Find them, Catch them(并查集)
题目:http://poj.org/problem?id=1703 题意:一个地方有两个帮派, 每个罪犯只属于其中一个帮派,D 后输入的是两个人属于不同的帮派, A后询问 两个人是否属于 同一个帮派. ...
- poj 1703 Find them, Catch them 【并查集 新写法的思路】
题目地址:http://poj.org/problem?id=1703 Sample Input 1 5 5 A 1 2 D 1 2 A 1 2 D 2 4 A 1 4 Sample Output N ...
- POJ 1703 Find them, Catch them (并查集)
题意:有N名来自两个帮派的坏蛋,已知一些坏蛋两两不属于同一帮派,求判断给定两个坏蛋是否属于同一帮派. 思路: 解法一: 编号划分 定义并查集为:并查集里的元素i-x表示i属于帮派x,同一个并查集的元素 ...
- POJ 1703 Find them, Catch them(并查集拓展)
Description The police office in Tadu City decides to say ends to the chaos, as launch actions to ro ...
- POJ 1703 Find them, Catch them(并查集,等价关系)
DisjointSet保存的是等价关系,对于某个人X,设置两个变量Xa,Xb.Xa表示X属于a帮派,Xb类似. 如果X和Y不是同一个帮派,那么Xa -> Yb,Yb -> Xa... (X ...
- POJ 2236 Wireless Network ||POJ 1703 Find them, Catch them 并查集
POJ 2236 Wireless Network http://poj.org/problem?id=2236 题目大意: 给你N台损坏的电脑坐标,这些电脑只能与不超过距离d的电脑通信,但如果x和y ...
- POJ 1703 Find them, Catch them(种类并查集)
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 41463 Accepted: ...
随机推荐
- HDU——1233还是畅通工程(克鲁斯卡尔+优先队列)
还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- HDU——2602Bone Collector(01背包)
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 刷题总结——棘手的操作(bzoj2333)
题目: 题目背景 SCOI2011 DAY2 T1 题目描述 有 N 个节点,标号从 1 到 N ,这 N 个节点一开始相互不连通.第i个节点的初始权值为 a[i] ,接下来有如下一些操作:U x y ...
- redis学习(一)redis简介
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统,是一种NoSql数据库.Redis是一个开源的使用ANS ...
- Eclipse + Apache Axis2 发布SOAP WebService(三)第一个程序Hello Axis2 SOAP!
因为Axis2同时支持SOAP和RESTful的WebService开发. 我的目标主要是RESTful,这里简单记录一个SOAP的小例子: 原文地址:https://jingyan.baidu.co ...
- C# 模拟windows文件名称排序(使用windows自带dll)
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] private static extern int StrCmpLogi ...
- hdu 3501 容斥原理或欧拉函数
Calculation 2 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- Microsoft发布新一代主机:Xbox One
当 Xbox One 这个名字从 Microsoft 高管 Don Mattrick 口中被念出来时,现场直接沸腾了.按照 Mattrick 的说法这是一款 all-in-one 的主机,而其核心价值 ...
- vim学习总揽
1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键. h (左移) j (下行) k (上行) l (右移) 2. 欲进入 Vim 编辑器(从命令行提示符),请输入:vim 文件 ...
- PL/SQL Developer工具包和InstantClient连接Oracle 11g数据库
一.前言 PLSQL Developer是Oracle数据库开发工具,很牛也很好用,PLSQL Developer功能很强大,可以做为集成调试器,有SQL窗口,命令窗口,对象浏览器和性能优化等功能. ...