带权并查集就是除了维护一个fa数组以外,维护一个rank数组,有两层含义,一个是路径压缩时边的权值,,再一个是当前点与根节点的相对关系。这个题很明显考察的是

根节点与当前节点的一种相对关系,让rank【x】 = 0 ,1,2表示A,B,C三个种类的动物,在刚开始的时候,所有的动物的rank值都是0,表示还没有给他们安排关系,随

着语句的输入,1xy表示把x,y置为相同值,2xy表示rank【x】 + 1 = rank【y】,然而在这里并不是直接改变y的rank的值,而是改变y所在的根结点的rank值,因为一旦x,y确

立了关系,和y在一个集合内的动物都与x建立了关系,这样只有改变根节点的rank才能保证每一个动物的rank都会被更新到,因为在x所在的集合和y所在的集合没有建立关系

之前,x,y的关系可以是任意的。

如果输入1xy,首先看x,y是否在一个集合内,如果是那麽x,y之间是一种绝对的关系,可以通过rank【x】和rank【y】的大小来判断语句的正确性,如果不是那麽x,y之间就没有

确定的关系,那么这句话就是对的,修改rank【y】所在集合的根结点的rank值,

输入2xy时和输入1xy时同理。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#define N 100005
#define lc rt<<1
#define rc rt<<1|1
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 5e4 + 10;int n,k;
int d,x,y;
int fa[maxn];
int rank[maxn];int find(int x)
{if(fa[x] == x)return x;int p = find(fa[x]);rank[x] = (rank[fa[x]] + rank[x])%3;return fa[x] = p;
}int main()
{//freopen("in","r",stdin);int cnt = 0;scanf("%d%d",&n,&k);for(int i = 0; i < n; ++i) fa[i] = i;memset(rank,0,sizeof(rank));for(int i = 0; i < k; ++i){scanf("%d%d%d",&d,&x,&y);if(x > n||y > n||(d == 2&&x == y)) {cnt++;continue;}int s1 = find(x),s2 = find(y);//求根节点if(d == 1){if(s1 == s2){if(rank[x] != rank[y]) cnt++;}else {rank[s2] = (rank[x] - rank[y] + 3)%3;//更新y的根结点,注意不要写错s2;fa[s2] = s1;//建立x集合与y集合的关系;}}else if(d == 2){if(s1 == s2) {if((rank[x] + 1)%3 != rank[y]) cnt++;}else {rank[s2] = (rank[x] + 1 - rank[y] + 3)%3;//同上fa[s2] = s1;}}//printf("%d %d\n",i,cnt);
     }printf("%d\n",cnt);
}

转载于:https://www.cnblogs.com/Norlan/p/4888413.html

POJ1182--带权并查集相关推荐

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

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

  2. 2017乌鲁木齐区域赛I(带权并查集)

    #include<bits/stdc++.h> using namespace std; int f[200010];//代表元 long long rl[200010];//记rl[i] ...

  3. BZOJ 2303 方格染色(带权并查集)

    要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...

  4. POJ1703带权并查集(距离或者异或)

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

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

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

  6. LA3027简单带权并查集

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

  7. hdu3234 带权并查集(XOR)

    题意:       给你n个未知的正整数,有三总操作       I P V            P的值是V       I P Q V          P XOR Q = V       Q K ...

  8. hdu4829 带权并查集(题目不错)

    题意: Information Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

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

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

  10. cdoj 1070 秋实大哥打游戏 带权并查集

    题目链接: http://acm.uestc.edu.cn/#/problem/show/1070 题意: 题解: 带权并查集 每次往上更新的时候,顺便把边权更新了就好 记住得路径压缩 代码: 1 # ...

最新文章

  1. ML之ME/LF:基于不同机器学习框架(sklearn/TF)下算法的模型评估指标(损失函数)代码实现及其函数(Scoring/metrics)代码实现(仅代码)
  2. android开源库收集
  3. c++的学习——画矩形
  4. 经典佳句(500)言
  5. iOS 导航栏透明度 监听导航栏返回进度
  6. 聊聊旷厂黑科技 | 更真切感受影像世界的美好,旷视实时双超AI算法还原你的“夏日回忆”...
  7. MBR15200FAC-ASEMI插件肖特基二极管MBR15200FAC
  8. 大一C语言 课设(餐厅管理系统)
  9. Java面试:数据库,Java,框架,前端技术。应有尽有
  10. 华为 Python:初级能力测评
  11. python之emoji表情处理
  12. POI获取文本单元格的数字变成科学计数法的处理方法
  13. 中科大统计学习(刘东)作业1
  14. localhost与ip的区别
  15. 泛微--考勤 加班申请: 加班天数不对。
  16. 如何将tomcat注册成windows系统服务方法
  17. JS正则表达式完整教程
  18. JS 实现 图片幻灯片 效果。 兼容 FF IE
  19. IOS面试题目(稍微深度型)
  20. code-push常用命令

热门文章

  1. 暑期项目经验(九) -- request session application
  2. windows docker 空出C盘 迁移到其他盘
  3. hadoop windows
  4. 10.32/10.33 rsync通过服务同步 10.34 linux系统日志 screen工具
  5. 查看oracle当前的连接数
  6. 天津海运[600751]股票
  7. oracle XMLType字段使用方法
  8. 如何安装Favicon
  9. ORM for Net主流框架汇总与效率测试
  10. 重装系统后,快盘不能拷贝进文件的解决办法