1703 -- Find them, Catch them

http://poj.org/problem?id=1703

题目大意:有2个敌对帮派,输入D a b表示a,b在不同帮派,输入A a b表示询问a,b是否是在一个帮派。

题解:因为并查集中的元素均是有联系的,否则也不会被合并到当前集合中。那么我们就把这2个元素之间的关系量转化为一个偏移量,

假设
x->y 偏移量0时 x和y同帮派

x->y 偏移量1时 x和y不同帮派

不妨继续假设,x的当前集合根节点tx,y的当前集合根节点ty。

如果tx和ty不相同,那么我们把ty合并到tx上,并且更新deltx[ty]值(注意:deltx[i]表示i的当前集合根节点到i的偏移量!!!!)

此时 tx->ty = tx->x + x->y + y->ty,可能这一步就是所谓向量思维模式吧

上式进一步转化为:tx->ty = (deltx[x]+1-deltx[y])%2 = deltx[ty],(模2是保证偏移量取值始终在[0,1]间)

接下来把这个想法再运用到路径压缩中:

ffx

|     \

fx      \

|         /

|     /

x

路径压缩过程中会将fx的父亲变为x的父亲,所以要改变相对关系,即偏移量。

ffx->fx+fx->x=ffx->x;

转换成:delta[x]=(delta[fx]+delta[x])%2;

int find(int x)
{
  if(x==fa[x])
    return fa[x];
  int f=fa[x];
  fa[x]=find(fa[x]);
  delta[x]=(delta[x]+delta[f])&1; //这句和上句不能交换位置,delta[]的改变是随着路径压缩是fa[]的改变而改变
  return fa[x];
}

#include <stdio.h>
int n;
int fa[],delta[]; //deltx[i]表示i的当前集合根节点到i的偏移量
void init()
{
int i;
for(i=;i<=n;i++)
{
fa[i]=i;
delta[i]=;
}
} int find(int x)
{
if(x==fa[x])
return fa[x];
int f=fa[x];
fa[x]=find(fa[x]);
delta[x]=(delta[x]+delta[f])&; //这句和上句不能交换位置,delta[]的改变是随着路径压缩是fa[]的改变而改变
return fa[x];
} void merge(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
fa[fy]=fx;
delta[fy]=(delta[x]+-delta[y])&;
}
}
int main()
{
int t,m,i,a,b;
char ch;
scanf("%d",&t);
while(t--)
{ scanf("%d%d%*c",&n,&m); //%*c替掉回车,ch吃回车,经常搞错,哎。。。
init();
for(i=;i<=m;i++)
{
scanf("%c%d%d%*c",&ch,&a,&b);
if(ch=='D')
merge(a,b);
if(ch=='A')
{
if(find(a)==find(b))
{
if(delta[a]==delta[b]) //根节点到a和b的偏移量相同时,a和b必定为同一帮派。朋友的朋友是朋友,敌人的敌人也是朋友
printf("In the same gang.\n");
else
printf("In different gangs.\n");
}
else
printf("Not sure yet.\n");
} } }
return ;
}

种类并查集(POJ 1703)的更多相关文章

  1. [并查集] POJ 1703 Find them, Catch them

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43132   Accepted: ...

  2. Poj(1703),种类并查集

    题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...

  3. 种类并查集,Poj(1703)

    题目链接:http://poj.org/problem?id=1703 第一次做种类并查集,有的地方还不是很清楚,想了一上午,有点明白了,这里记录一下. 这里我参考的红黑联盟的题解. 关键:种类并查集 ...

  4. pku 1703(种类并查集)

    题目链接:http://poj.org/problem?id=1703 思路;个人觉得本质上还是和带权并查集一样的,只不过多了一个MOD操作,然后就是向量关系图稍微改动一下就变成种类并查集了,对于本题 ...

  5. poj 1182:食物链(种类并查集,食物链问题)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44168   Accepted: 12878 Description ...

  6. POJ 1733 Parity game(种类并查集)

    http://poj.org/problem?id=1733 题意: 给出一个01串,有多次询问,每次回答[l,r]这个区间内1的个数的奇偶性,但是其中有一些回答是错误的,问到第几个回答时与前面的回答 ...

  7. Poj(1182),种类并查集

    题目链接:http://poj.org/problem?id=1182 再次熟练种类并查集,又积累点经验,和技巧,rank 0 2 1 先计算father[x] ,再更新rank[x]; #inclu ...

  8. poj 1182 食物链(种类并查集 ‘初心者’)

    题目链接:http://poj.org/problem?id=1182 借着这题可以好好理解一下种类并查集,这题比较简单但挺经典的. 题意就不解释了,中问题. 关于种类并查集结局方法也是挺多的 1扩增 ...

  9. 【POJ】2492 A bug's life ——种类并查集

    A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 28211   Accepted: 9177 De ...

  10. C - BLG POJ - 1417 种类并查集加dp(背包)

    思路:刚看这道题感觉什么都不清楚,人物之间的关系一点也看不出来,都不知道怎么写,连并查集都没看出来,但是你可以仔细分析一下,当输入字符串为“yes”的时候,我们设输入的值为x和y,当x为天使是则由题可 ...

随机推荐

  1. Javascript中call函数和apply函数的使用

    Javascript 中call函数和apply的使用: Javascript中的call函数和apply函数是对执行上下文进行切换,是将一个函数从当前执行的上下文切换到另一个对象中执行,例如: so ...

  2. 无需输入密码的scp/ssh/rsync操作方法

    一般使用scp/ssh/rsync传输文件时,都需要输入密码.下面是免密码传输文件的方法. 假设要在两台主机之间传送文件,host_src & host_dst.host_src是文件源地址所 ...

  3. 使用Firefox user agent进行移动端网页测试

    Selenium 真是个强大的网页测试工具,设置Firefox user agent, 就可以轻松模拟手机端浏览器进行网页测试. Demo Code # -*- coding:utf8 -*- imp ...

  4. MongoDB学习笔记三:查询

    MongoDB中使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数决定了要返回哪些文档,其形式也是一个文档,说明要执行的查询细节.空的查询 ...

  5. Android项目的目录结构

    assets  资产目录,  存放一个文件的 这个文件会被打包到应用程序的apk(安装包 ) bin 编译后的文件目录 gen 自动生成文件的目录 roject.properties 代表编译的版本  ...

  6. 【Unity3D基础教程】给初学者看的Unity教程(一):GameObject,Compoent,Time,Input,Physics

    作者:王选易,出处:http://www.cnblogs.com/neverdie/  欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点推荐.谢谢! Unity3D重要模块的类图 最近刚刚完成了一 ...

  7. unity, 顶点对齐

    按住v键,选中物体的一个顶点,可以对齐到其它物体的某个顶点上. 参考https://docs.unity3d.com/Manual/PositioningGameObjects.html

  8. sql查看数据字典(表结构)

    SELECT (case when a.colorder=1 then d.name else null end) 表名, a.colorder 字段序号,a.name 字段名, (case when ...

  9. MSClass 和setInterval 的并发,ajax定时有采集信息滚动显示

    setTimeout 用于延时器,只执行一次. setInterval:用于多次执行. //****************************************** 项目中引用到jquer ...

  10. Protocol Buffer技术

    转载自http://www.cnblogs.com/stephen-liu74/archive/2013/01/02/2841485.html 该系列Blog的内容主体主要源自于Protocol Bu ...