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——2064汉诺塔III
汉诺塔III Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- 模拟tap事件和longTap事件
移动端模拟tap和longTap事件,基本原理就是在touchstart和touchend事件中,计算触摸的位移和时间差,位移在一定范围内(轻微滑动),时间小于150ms为tap事件,时间大于300m ...
- bzoj3207花神的嘲讽计划Ⅰ
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=3207 给定一个原字符串和m个询问,每次查询原字符串[l,r]内是否包含给定字符串s (len( ...
- Vmware Linux虚拟机磁盘扩容方法
我的LINUX版本是ubuntu12.04 32bit.今天在下载android源代码的时候发现自己最初给这个虚拟机分配的磁盘空间不足了(只有20G).所以就需要给磁盘扩容.网上大致搜索了一下,主要有 ...
- 在vue单页面应用当中使用sass
之前在项目当中有使用过sass,但是使用的方式有点Low,是在vue文件当中的style下面通过@import的方式引入的. 其实在webpack当中也可以通过在main.js当中import &qu ...
- cf 472G Design Tutorial: Increase the Constraints 分块+压位/FFT
题目大意 给出两个\(01\)序列\(A\)和\(B\) 哈明距离定义为两个长度相同的序列中,有多少个对应位置上的数字不一样 "00111" 和 "10101" ...
- JS判断SharePoint页面编辑状态
这篇博客主要讲使用不同的客户端方式来判断页面的编辑模式. 1.当页面处于发布状态时,可以使用下面两种方式:if(g_disableCheckoutInEditMode == true) { ale ...
- es6总结(七)--proxy & reflect
- https的简单学习
HTTPS介绍: (全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Sec ...
- Codeforces Gym101502 H.Eyad and Math-换底公式
H. Eyad and Math time limit per test 2.0 s memory limit per test 256 MB input standard input outpu ...