题意:
      有两个黑社会帮派,有n个人,他们肯定属于两个帮派中的一个,然后有两种操作
1 D a b 给出a b 两个人不属于同一个帮派
2 A a b 问a b 两个人关系 输出 同一个帮派,不是同一个帮派,或者不确定

思路:  
      比较简单的带权并查集,容易想,方法固定,可以开距离根节点的距离这个权,或者是异或也行(应该是行,没试),如果是距离根节点的话 就是每次D a b 都把a b 看成是距离1,然后接在一起,A a b 时候看是不是同一个祖先,是的话看看距离权值是否奇偶性相同,如果不是同一个祖先就是不确定,还有连接之前记得看看是不是已经是一个祖先了,如果是就不要连接了,不然会把整体的权值弄乱,对于异或的话,直接在奇偶性那改成判断相等就行了。

#include<stdio.h>
#include<string.h>

#define N 100000 + 10

int mer[N];
int s_x[N];

int Finds(int x)
{
    if(x == mer[x]) return x;
    int t = mer[x];
    mer[x] = Finds(mer[x]);
    s_x[x] += s_x[t];
    return mer[x];
}

int main ()
{
    int t ,n ,m ,i ,a ,b;
    char str[5];
    scanf("%d" ,&t);
    while(t--)
    {
        scanf("%d %d" ,&n ,&m);
        for(i = 1 ;i <= n ;i ++)
        mer[i] = i ,s_x[i] = 0;

for(i = 1 ;i <= m ;i ++)
        {
            scanf("%s %d %d" ,str ,&a ,&b);
            int x = Finds(a);
            int y = Finds(b);
            if(str[0] == 'D')
            {
                if(x == y) continue;
                if(s_x[a] >= s_x[b])
                {
                    mer[y] = x;
                    s_x[y] = s_x[a] - s_x[b] + 1;
                }
                else
                {
                    mer[x] = y;
                    s_x[x] = s_x[b] - s_x[a]  - 1;
                }
            }
            else
            {
                if(n == 2 && a != b)
                {
                    printf("In different gangs.");
                }
                else if(x == y)
                {
                    if(s_x[a] % 2 == s_x[b] % 2)
                    printf("In the same gang.\n");
                    else printf("In different gangs.\n");
                }
                else
                {
                    printf("Not sure yet.\n");
                }
            }
        }
    }
    return 0;
}

POJ1703带权并查集(距离或者异或)相关推荐

  1. POJ1988(带权并查集,搬砖块)

    题意:        可以这样理解,有n快方形积木,一开始都是单独的放到哪,然后有两种操作 1 M a b 把a所在的那一堆落到b所在那一堆的上面(一开始自己是一堆) 2 C a 问a下面有多少个积木 ...

  2. LA3027简单带权并查集

    题意:       有n个点,一开始大家都是独立的点,然后给出一些关系,a,b表示a是b的父亲节点,距离是abs(a-b)%1000,然后有一些询问,每次询问一个节点a到父亲节点的距离是多少? 思路: ...

  3. poj1182 and 携程预赛2第一题 带权并查集

    题意:       动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.  现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底 ...

  4. How Many Answers Are Wrong HDU - 3038(带权并查集经典题,满满的都是注释)

    How Many Answers Are Wrong HDU - 3038  点击打开链接 题意:现在有n个数(你并不知道这n个数是什么),m次查询,每次查询给出u,v,w.表示从第u个数到第v个数的 ...

  5. CDOJ 1070 秋实大哥打游戏 带权并查集

    链接 F - 秋实大哥打游戏 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit ...

  6. 2015 UESTC 数据结构专题H题 秋实大哥打游戏 带权并查集

    秋实大哥打游戏 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Descr ...

  7. POJ 2492 A Bug's Life 带权并查集

    题意: 思路: mod2 意义下的带权并查集 如果两只虫子是异性恋,它们的距离应该是1. 如果两只虫子相恋且距离为零,则它们是同性恋. (出题人好猥琐啊) 注意: 不能输入一半就break出来.... ...

  8. How Many Answers Are Wrong HDU - 3038(带权并查集)

    TT and FF are - friends. Uh- very very good friends -________-b FF is a bad boy, he is always wooing ...

  9. BZOJ 3362 Navigation Nightmare 带权并查集

    题目大意:给定一些点之间的位置关系,求两个点之间的曼哈顿距离 此题土豪题.只是POJ也有一道相同的题,能够刷一下 别被题目坑到了,这题不强制在线.把询问离线处理就可以 然后就是带权并查集的问题了.. ...

最新文章

  1. 继人工智能攻陷围棋,德州扑克也沦陷了
  2. python 画图 内存-用python 10min手写一个简易的实时内存监控系统
  3. table 在网页无法顶到头部问题
  4. Java里的堆(heap)栈(stack)和方法区(method)
  5. zoj 3327 Friend Number 模拟题
  6. matlab常用函数——方程函数
  7. HDU #5733 tetrahedron
  8. 特斯拉皮卡,会大卖吗?
  9. 社区发现(五)--BP(信念传播算法)
  10. 【Flutter】基础组件【07】Appbar
  11. app上显示服务器数据加载失败,APP中的6种常见数据加载
  12. 如何走出创新者的窘境?走向2049
  13. 路由器(无线桥接)中继模式遇到无法上网的解决方案
  14. VS2019C++编译GDAL3.3.2+SQLite3+PROJ6+GEOS3.7.3+HDF4+HDF5(保姆级教程)
  15. 总结 | C#实现Excel导出功能
  16. Dockerfile Registry WebUI 之 docker-registry-frontend 高级应用
  17. 如何进行英文文献检索
  18. 百度地图 android 自身地点,Android使用百度地图SDK获得当前设备位置所在的省、市(系列1)...
  19. 【Vue.JS】纯 Vue.js 制作甘特图
  20. 7款免费发短信软件,看看哪一款适合你

热门文章

  1. linux 系统命令
  2. LVS集群-DR负载均衡集群
  3. 一个简单的运算表达式解释器例子
  4. 修改/etc/sudoers权限后的补救方法
  5. 用python中的cv2库打开摄像头
  6. 29_Java_数据库_第29天(JDBC、DBUtils)_讲义
  7. python 函数部分
  8. Redis的安装部署
  9. lucene 自定义评分
  10. 绑定Service的三种实现方式之使用Messenger